设计模式中的代理模式

it2023-04-11  75

代理模式中静态模式与动态模式

静态模式的优点就是代码简便,但只局限于一种类型的代理,而动态模式就是可以帮助多个类型代理 动态模式借助Object的万能性来帮助多个类代理,但动态代理会借助放射的思想,代码有些许复杂

代理设计的静态模式

就用模拟老师案例来演练

//功能接口 public interface Teacher { abstract String teaching(); } //模拟老师对象 class HuangTeacher implements Teacher{ @Override public String teaching() { System.out.println("黄老师她是教销售的"); return "下课了,我布置点作业"; } } //代理输出类,只能代理某一类 class TeacherProxy implements Teacher{ private Teacher t; public TeacherProxy (Teacher t) { this.t=t; } @Override public String teaching() { return t.teaching(); } } //测试类 class Test { public static void main(String[] args) { HuangTeacher h=new HuangTeacher(); //实例黄老师对象 TeacherProxy t=new TeacherProxy(h); System.out.println(t.teaching()); } }

动态代理模式

//教师类 public interface Teacher { abstract String teaching(); } //林老师类 public class LinTeacher implements Teacher{ @Override public String teaching() { System.out.println("林老师上课贼酷了,而且知识又那么深厚!"); return "下课了"; } } //动态代理类 /** * 1. ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法固定 * 2. Class<?>[] interfaces:目标对象实现的接口类型,使用泛型方法确认类型 * 3. InvocationHandler h: 事情处理,执行目标对象的方法时,会触发事情处理器方法, * 会把当前执行的目标对象方法作为参数传入 * @return */ public class TeacherProxy { private static Object t; TeacherProxy(Teacher t) {this.t=t;} public Object getT() { methor(); return Proxy.newProxyInstance(this.t.getClass().getClassLoader(), this.t.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(t,args); } }); } public void methor(){ System.out.println("上课......"); } } //测试类 public class Test { public static void main(String[] args) { LiTeacher li=new LiTeacher(); Teacher t=(Teacher) new TheacherProxy(li).getT(); System.out.println(t.teaching()); LinTeacher lin=new LinTeacher(); Teacher t2=(Teacher) new TheacherProxy(lin).getT(); System.out.println(t2.teaching()); } }
最新回复(0)