首页 > 学院 > 开发设计 > 正文

设计模式——代理设计模式

2019-11-09 17:19:08
字体:
来源:转载
供稿:网友

学习了一下代理设计模式,顺便记录一下心德。 代理模式在编程中比较常见同时在生活中我们也是比较常见的,比如让同事给带饭,找婚介公司给筹划婚礼,找中介公司给你把房子租出去等。 代理模式使用场景: 对一个类我们不能获取到某个对象或者不想直接获取某个对象时可以通过一个代理对象间接访问该对象,委托对象与代理对象需要实现相同的接口。 代理模式的几个角色: Subject:抽象主题类 RealSubject:具体实现类 PRoxy:代理类,持有具体实现类的引用. 代理模式分为两种:静态代理+动态代理。

静态代理

在代码运行之前代理类的class编译文件就已经存在。 看下简单的代码。根据上面说的委托对象与代理对象需要实现相同的接口。接口也就少不了。

接口

public interface iprogrammer { void program();}

实现类

public class AndroidProgrammer implements IProgrammer { @Override public void program() { Log.e("程序员","写代码"); }}

代理类

public class ProxyProgrammer { AndroidProgrammer programmer;//持有具体实现类的引用 public ProxyProgrammer(AndroidProgrammer programmer) { this.programmer = programmer; } public void program(){ programmer.program(); Log.e("你猜这是什么","答:静态代理"); }}

调用

AndroidProgrammer programmer=new AndroidProgrammer(); ProxyProgrammer pp=new ProxyProgrammer(programmer); pp.program();

动态代理

通过反射机制动态的生成代理者的对象。在编程过程中我们不需要知道代理谁,只有在执行阶段才知道代理的谁。在java中也为我们提供了invocationHandler接口方便我们实现动态代理。

接口(同上)

public interface IProgrammer { void program();}

实现类(同上)

public class AndroidProgrammer implements IProgrammer { @Override public void program() { Log.e("程序员","写代码"); }}

代理类(实现InvocationHandler 接口)

public class ProgrammerHandler implements InvocationHandler { AndroidProgrammer programmer; public ProgrammerHandler(AndroidProgrammer programmer) { this.programmer = programmer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { programmer.program(); Log.e("你猜这是什么","答:动态代理"); return null; }}

调用

AndroidProgrammer programmer=new AndroidProgrammer(); ProgrammerHandler invocation=new ProgrammerHandler(programmer); IProgrammer ip= (IProgrammer) Proxy.newProxyInstance(AndroidProgrammer.class.getClassLoader(),new Class[]{IProgrammer.class},invocation); //也可以这么写// IProgrammer ip= (IProgrammer) Proxy.newProxyInstance(AndroidProgrammer.class.getClassLoader(),programmer.getClass().getInterfaces(),invocation); ip.program();

小结

总体来讲代理设计模式基本没什么缺点并且应用广泛,Android源码中的ActivityManagerService就使用到了代理设计模式。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表