首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

design pattern——署理模式

2012-11-08 
design pattern——代理模式针对问题:? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可

design pattern——代理模式

针对问题:? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

? ? ? 代理模式和装饰模式很相似,不同之处在于代理模式是给主题添加控制,但是这些控制来自代理自身的实现,不像装饰模式一样添加的功能来自己主题的子类提供。

? ? ? 装饰模式可以装饰很多次来得到自己想要的实体,类似的代理模式也可以代理很多次,但通常不会这种做,因为这不是代理模式的目的。装饰模式的目的是添加功能,而代理模式的目的是添加控制。

?

?

?

?

?

代理模式结构图:


design pattern——署理模式

?

?

?

?

?

代理模式实现代码:

?

/** * 抽象主题类 * @author bruce * */public abstract class Subject {public abstract void request();}/** * 具体主题类 * @author bruce * */public class RealSubject extends Subject{@Overridepublic void request() {// TODO Auto-generated method stubSystem.out.println("real do something");}}/** * 代理类 * @author bruce * */public class Proxy extends Subject{private Subject subject;public Proxy(Subject subject){this.subject=subject;}@Overridepublic void request() {// TODO Auto-generated method stubdoBefore();subject.request();doAfter();}private void doBefore(){System.out.println("before doing something");}private void doAfter(){System.out.println("after doing something");}}/** * 测试 * @author bruce * */public class Client {public static void main(String[] args) {Subject subject=new Proxy(new RealSubject());subject.request();/** * output:    before doing somethingreal do somethingafter doing something */}}

?

?

?

?

?

?

?

?

动态代理模式:代理模式只能在运行前写好,也就是说是静态的,而动态代理可以在运行时期创建(运用反射)

?

?

?

动态代理模式实现代码:

?

/** * 抽象主题类 * @author bruce * */public interface Subject {public void requestA();public void requestB();}/** * 具体主题类 * @author bruce * */public class RealSubject implements Subject{public void requestA() {// TODO Auto-generated method stubSystem.out.println("do A");}public void requestB() {// TODO Auto-generated method stubSystem.out.println("do B");}}/** * 代理内容实现 * @author bruce * */public class SubjectProxy implements InvocationHandler{private Subject subject;public SubjectProxy(Subject subject){this.subject=subject;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stubObject object;if(method.getName().equals("requestA")){System.out.println("allow to do requestA method");object=method.invoke(subject, args);return object;}else if(method.getName().equals("requestB")){System.out.println("not allow to do requestB method");return null;}else{System.out.println("other method");}return null;}}/** * 测试 * @author bruce * */public class Client {public static void main(String[] args) {RealSubject subject=new RealSubject();Subject proxy=(Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new SubjectProxy(subject));System.out.println("------------");proxy.requestA();System.out.println("------------");proxy.requestB();/** * output: *  ------------allow to do requestA methoddo A------------not allow to do requestB method */}}
?

热点排行