代理模式的英文原文是:Provide a surrogate or placeholder for another object to control access to it. 意思是:为其他对象提供一种代理,以控制对这个对象的访问。
有以下三种角色:
1、抽象主题:是真实主题和代理主题的接口,代理主题要实现这个抽象主题,这样就可以使用代理主题代理真实主题。
2、真实主题:业务逻辑具体执行者,被代理的对象。
3、代理主题:该角色有真实主题的引用,可以在真实主题的操作前后增加操作。
代理模式的类图:
各个类对应的代码:
抽象主题:
package com.zz.proxy; /** * 抽象主题 * Copyright 2015年4月14日 * created by txxs * all right reserved */ public interface Subject { //定义一个请求 public void request(); }
package com.zz.proxy; /** * 真实主题 * Copyright 2015年4月14日 * created by txxs * all right reserved */ public class RealSubject implements Subject { public void request() { //业务逻辑处理 } }
package com.zz.proxy; /** * 代理主题 * Copyright 2015年4月14日 * created by txxs * all right reserved */ public class ProxySubject implements Subject { private Subject subject; public ProxySubject(Subject subject){ this.subject = subject; } //在原方法的基础上增加方法 @Override public void request() { this.beforeRequest(); subject.request(); this.afterRequest(); } //请求前的操作 private void beforeRequest(){ //预处理 } //请求后的操作 private void afterRequest(){ //处理结束 } }
1、职责清晰:真实角色可以只实现实际的业务逻辑,不用实现非本职的业务,通过代理来实现后续业务的添加,是编程逻辑清晰。
2、高扩展性:真实角色是要实现了公共的接口,代理对象就可以代理真实角色。
3、灵活:代理类可以在运行时才确定代理的真实角色。
通过一个实例来应用代理模式———房屋出租。拥有房源的用户进行房屋出租,其有两个方法一个是goBargain()方法用来商议价格,另一个方法是houseRental()方法是定价完成后进行出租。拥有房源的用户实现了房屋出租的接口,这里有一个房屋出租中介,这个中介同样实现了房屋出租的接口。这个中介就可以代理这些房屋。源码下载
实现效果:
原文地址:http://blog.csdn.net/maoyeqiu/article/details/45043415