设计模式:代理模式
来源:互联网 发布:求数组最大值的下标 编辑:程序博客网 时间:2024/06/08 03:30
原文地址:http://leihuang.org/2014/12/09/proxy/
Structural 模式 如何设计物件之间的静态结构,如何完成物件之间的继承、实 现与依赖关系,这关乎着系统设计出来是否健壮(robust):像是易懂、易维护、易修改、耦合度低等等议题。Structural 模式正如其名,其分类下的模式给出了在不同场合下所适用的各种物件关系结构。
- Default Adapter 模式
- Adapter 模式
- Bridge 模式
- Composite 模式
- Decorator 模式
- Facade 模式
- Flyweight 模式
- Proxy 模式
代理模式分为静态代理和动态代理.
静态代理
代理模式使你可以为一个对象创建一个代理,代替它去执行它的行为,举个例子,我们程序员找工作的时候,我们可以让猎头代替我们自己去联系公司找工作,此处的猎头就是代理,而我们则时被代理对象.
代码如下
public class StaticProxy { public static void main(String[] args) { // 你自己,相当于你实现了Runnable接口的类 Application me = new Me(); // 猎头代替你找工作,其实相当于Thread类 Application hunter = new HeadHunter(me); hunter.apply(); }}// 要实现找工作的功能interface Application { public void apply();}// 真正要找工作的我class Me implements Application { @Override public void apply() { System.out.println("找到工作了"); }}hexing// 猎头,代替你找工作class HeadHunter implements Application { private Application apply = null; public HeadHunter() { } public HeadHunter(Application application) { this.apply = application; } private void before() { System.out.println("联系你"); } private void after() { System.out.println("送你进合适公司"); } @Override public void apply() { before(); apply.apply(); after(); }}动态代理模式动态代理模式其实原理跟静态代理模式是一样的,只不过利用了反射机制使得系统更灵活.静态代理模式只能代理特定接口下的子类,而动态代理可以代理任何类.import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy { public static void main(String[] args) { Application me = new Me() ; HeadHunter head = new HeadHunter() ; Application apply = (Application) head.newProxyInstance(me) ; apply.applay(); }}interface Application { public void applay();}class Me implements Application { @Override public void applay() { System.out.println("面试!"); }}class HeadHunter implements InvocationHandler { private Object target = null; public Object newProxyInstance(Object target) { this.target = target; // 第一个参数,目标的装载器 // 第二个参数,目标接口,为每个接口生成代理 // 第三个参数,调用实现了InvocationHandler的对象,当你一调用代理,代理就会调用InvocationHandler的invoke方法 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 反射,这样你可以在不知道具体的类的情况下,根据配置的参数去调用一个类的方法。在灵活编程的时候非常有用。 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before() ; //替你联系公司 method.invoke(target, args); //掉用目标方法--面试 after() ; //送你进公司 return null; } private void before(){ System.out.println("联系你"); } private void after(){ System.out.println("送你进合适公司"); }}
0 0
- 设计模式--【代理模式】
- 设计模式:代理模式
- 设计模式--代理模式
- 设计模式---代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式 代理模式
- 设计模式-【代理模式】
- 设计模式-代理模式
- 设计模式----代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式--代理模式
- 设计模式-代理模式
- 设计模式- 代理模式
- 设计模式---代理模式
- 设计模式 - 代理模式
- 【设计模式】代理模式
- Android Studio 1.0正式版,安装后启动阻止其联网问题
- std::map
- SQL之函数
- 虚拟机软中断问题
- 网络流 -- Power Network(最大流算法)
- 设计模式:代理模式
- Storm-源码分析汇总
- mysql更改密码
- 子类继承父类
- 12月集训Test1
- [Android] 任意时刻从子线程切换到主线程的实现原理及加强版
- linux监控命令全覆盖(图文说明)
- 变量和运算符
- 网络流 -- Sightseeing tour (混合图欧拉路判定)