代理模式(Proxy):
为其他对象提供一个代理以控制对这个对象的访问
举例
类比代购:
顾客 | 真正付款的人 |
代购者 | 帮忙买东西,解决我们无法现场买的问题(辅助解决真实问题) |
注意:
1.在物品成交前,买家不知道是哪个代购帮买,代购也不知道具体帮谁买。所以这块用的是接口,而不是具体子类。
private ISubject realSubject
2.需要的东西:
1)业务接口ISubject:需要干的事-即要买的东西(假如买电脑)-买电脑是核心业务
2)真实业务类:真正付款买东西的买家
3)代理类:辅助我们买东西,有辅助操作-如买东西前后干的事
4)平台:通过平台Platform,将代理人与客户产生联系
5)业务:取得一个业务对象-平台下单
代码实现:
/**
* 业务接口-需要干的事:即买电脑(买电脑是核心业务)
*/
interface ISubject{
void buyComputer();
}
/**
* 真实业务类:真实付款买电脑的人
*/
class RealSubject implements ISubject{
@Override
public void buyComputer() {
System.out.println("买个 mac pro 15寸顶配电脑");
}
}
/**
* 代理类:辅助我们买电脑,有买电脑的辅助操作,即买电脑前preHandle()后postHandle()做的事也包含在代理类
*/
class ProxySubject implements ISubject{
private ISubject realSubject;//真正成交前,买电脑的人也不知道具体哪个代购帮买,代购也不知道具体要帮谁买,所以这块用的是接口,而不是具体哪个子类
//通过构造方法把真实业务传进来
public ProxySubject(ISubject realSubject) {
this.realSubject = realSubject;
}
public void preHandle(){
System.out.println("买票去某地看好电脑");
}
@Override
public void buyComputer() {
//调用买前操作
preHandle();
//付钱这个操作是通过真实业务处理的-真实的付钱人付钱
this.realSubject.buyComputer();
//调用买后操作
postHandle();
}
public void postHandle(){
System.out.println("再买票把电脑带回来");
}
}
/**
* 最终通过平台Platform,将代理人和客户产生联系
* 创建了代理类,在创建了代理类的同时把客户RealSubject就传入了
*/
class Platform{
//获取
public static ISubject getInstance() {
return new ProxySubject(new RealSubject());//在代购平台上下单
}
}
/**
* 业务-买电脑
*/
public class Subject {
public static void main(String[] args) {
ISubject subject=Platform.getInstance();//取得一个业务的对象
subject.buyComputer();
}
}
总结
代理模式是基于接口的,一个接口实现两个类,一个是真实业务类,另一个是辅助真实业务的代理类,最终将真实业务传递给代理类来完成整个业务的实现。