代理模式的英文原文是: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()方法是定价完成后进行出租。拥有房源的用户实现了房屋出租的接口,这里有一个房屋出租中介,这个中介同样实现了房屋出租的接口。这个中介就可以代理这些房屋。源码下载
实现效果: