欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java设计模式之工厂模式、静态代理模式、动态代理模式

程序员文章站 2022-07-10 19:07:26
工厂模式代码实现:步骤一:创建一个接口Car.javapackage FactoryMode;public interface Car {public void run();}步骤二:创建实现类BaoMaCar.javapackage FactoryMode;public class BaoMaCar implements Car {@Overridepublic void run() {// TODO Auto-generated method stub...

工厂模式

java设计模式之工厂模式、静态代理模式、动态代理模式

代码实现:
步骤一:创建一个接口

Car.java

package FactoryMode; public interface Car { public void run(); } 

步骤二:创建实现类
BaoMaCar.java

package FactoryMode; public class BaoMaCar implements Car { @Override public void run() { // TODO Auto-generated method stub System.out.println("这是宝马车的run方法"); } } 

AoDiCar.java

package FactoryMode; public class AoDiCar implements Car { @Override public void run() { // TODO Auto-generated method stub System.out.println("这是奥迪车的run方法"); } } 

步骤三:创建一个工厂类
CarFactory.java

package FactoryMode; public class CarFactory { public Car getCar(String carName) { switch(carName) { case "奥迪": return new AoDiCar(); case "宝马": return new BaoMaCar(); default: System.out.println("该车厂不提供该品牌的车"); return null; } } } 

步骤四:测试
test.java

package FactoryMode; public class Test { public static void main(String[] args) { CarFactory cf = new CarFactory(); //获取宝马品牌的车 Car BaoMa=cf.getCar("宝马"); BaoMa.run(); //获取奥迪品牌的车 Car AoDi = cf.getCar("奥迪"); AoDi.run(); Car BenChi=cf.getCar("奔驰"); System.out.println(BenChi); } } 

运行结果:
java设计模式之工厂模式、静态代理模式、动态代理模式

静态代理模式

java设计模式之工厂模式、静态代理模式、动态代理模式静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类

步骤一:创建共同的接口

IPerson.java

package StaticAgencyMode; public interface IPerson { public void study(); } 

步骤二:创建代理对象的类
ProxyPerson.java

package StaticAgencyMode; public class ProxyPerson implements IPerson { private IPerson person; public ProxyPerson(IPerson person) { this.person = person; } @Override public void study() { // TODO Auto-generated method stub System.out.println("这是代理person的study方法"); this.person.study(); } } 

步骤三:创建被代理对象的类

Person.java

package StaticAgencyMode; public class Person implements IPerson { @Override public void study() { // TODO Auto-generated method stub System.out.println("这是person的study方法"); } } 

步骤四:创建测试类

Test.java

package StaticAgencyMode; public class Test { public static void main(String[] args) { Person p = new Person(); ProxyPerson pp = new ProxyPerson(p); pp.study(); } } 

运行结果
java设计模式之工厂模式、静态代理模式、动态代理模式

动态代理模式

代理类是jdk中自带的类,利用反射技术,动态生成代理对象

动态代理有以下特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理

JDK中生成代理对象的API
代理类所在包:java.lang.reflect.Proxy

代码实现
步骤一:被代理对象的接口
Person.java

package DynamicAgencyMode; //被代理对象的接口 public interface Person { public void giveMoney(); } 

步骤二:被代理对象的类

Student.java

package DynamicAgencyMode; //被代理对象的类 public class Student implements Person{ private String name; public Student(String name) { super(); this.name = name; } @Override public void giveMoney() { // TODO Auto-generated method stub System.out.println(name+" 上交班费100元"); } } 

步骤三:代理对象的类,实现了InvocationHandler接口

StuInvocationHandler.java

package DynamicAgencyMode; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //代理对象的类 public class StuInvocationHandler implements InvocationHandler { //invocationHandler持有的被代理对象 private Object target; public StuInvocationHandler(Object target) { super(); this.target = target; } /**
     * proxy:代表动态代理对象
     * method:代表正在执行的方法
     * args:代表调用目标方法时传入的实参
     */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object ProxyStu = method.invoke(target,args); // TODO Auto-generated method stub return ProxyStu; } } 

步骤四:测试类
Test.java

package DynamicAgencyMode; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { //创建一个实例对象 Person stu = new Student("小刘"); //创建一个与代理对象相关联的InvocationHandler InvocationHandler stuHandler = new StuInvocationHandler(stu); //创建一个代理对象stuProxy来代理stu,代理对象的每个执行方法都会替换执行Invocation的invoke方法 Person ProxyStu = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler); ProxyStu.giveMoney(); } } 

运行结果
java设计模式之工厂模式、静态代理模式、动态代理模式

本文地址:https://blog.csdn.net/qq_41150890/article/details/108020451