设计模式之代理模式(Proxypattern)
2020-04-24 本文已影响0人
杨斌_1024
代理模式概述
代理模式是一种设计模式,类似让A去做事情,但是客户端通过引用目标对象(A)的代理对象完成对A的方法或行为的执行操作,代理对象可以在自己的方法的内部增强A的行为。
例如:小明开了一个网店,去批发商进货,批发商的货物又是从一个大型超市进的。
这里就是代理模式,小明作为客户(客户端),通过批发商(代理对象)去超市进货物,经过了开车=>付钱=>超市交货=>拿货,小明然后拿到货物。这里的除超市交货,其他行为都是批发商(代理对象)产生,这是所谓的方法增强。
类结构图

静态代理

静态代理的一个特点就是,代理对象的类是显示声明的(需要自己写代理类),在代理类里面使用目标对象的引用。
上图的意思就是:Animal接口有两个实现类Monkey,Person.现在要使用静态代理Animal, 那么先声明一个代理类(StaticProxy),通过这个代理类来生成Animal的代理对象,再一个这个代理类要实现Animal接口,并且里面要有Animal的引用。这样才能引用Animal的方法。
缺点:
只能代理一种类型的对象,如果想要代理其他的类,那么代理类需要不断的去实现目标对象的方法。再一个不符合设计模式的原则,1.开放-封闭原则 2.单一职责
动态代理

动态代理的一个特点就是不用显式的声明代理类,代理对象是动态生成的(运行期间),并且可代理任何对象。
上图的意思:通过DynamicProxyFactory在运行期间生成代理对象dynamicProxy,而dynamicProxy持有Animal,Machine等向上转型的Object引用(Object target), 通过反射可以执行具体目标实现类的方法,达到动态代理的目的。