什么是代理模式?
为其他对象提供一种代理以控制对这个对象的访问.说白了,对应到现实生活中就是:某人想做一件事,但是不想或不能直接去做,这时候就需要找个人来替他做这件事。
代理模式一般涉及到三个角色:
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
生动的例子
我们每个人几乎都有春节回家买火车票的经历吧,那是相当的痛苦,跑到火车站售票口排一晚上的队都不一定能买到票。有需求就有市场啊,于是就有了票贩子,我们宁愿多花点钱,能买到回家的票是主要的啊,于是恶性循环开始了。。。
在这个例子中:
抽象角色就是买票这个行为,乘客和票贩子都有的共同行为;
代理角色就是乘客,乘客在找票贩子之前肯定要先查一下火车的班次、票价等信息,然后联系票贩子买票,买到后付款等等;
真实角色就是票贩子了,最终去买票的是票贩子,因为乘客必须要经过他才能买到票。
类图:
实例代码
/**
* 买票
* @author User
*
*/
public interface BuyTicket {
void buy();
}
public class Scalper implements BuyTicket {
@Override
public void buy() {
System.out.println("火车站内部拿票或者去也去排队买票!");
}
}
public class Passenger implements BuyTicket {
Scalper scalper = new Scalper();
@Override
public void buy() {
System.out.println("查询火车班次和票价");
scalper.buy();
System.out.println("验票付款");
}
}
与其他模式的比较
适配器模式
看上去,适配器模式与代理模式很像,他们都可视为一个对象提供一种前置的接口,但是,适配器的用意是要改变所考虑的对象的接口,而代理模式并不能改变所代理的对象的接口。
装饰模式
装饰模式与所装饰对象具有相同的接口,因此这两种模式也有可能混淆。但是,装饰模式应当为所装饰的对象提供增强功能,而代理模式是对代理对象的使用进行控制,并不提供代理对象本身的增强功能。
门面模式
有时候门面模式兼任代理的模式,这种时候门面模式又叫做代理门面模式,或者门面代理模式。