**
代理模式
**
1.是什么
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
好家伙!!中介
说到中介都不陌生
2.用在哪
客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象 .
市面上所有的中间商赚了次差价的,没有直接和厂家产生联系的交易
我在工厂模式里面开的小卖部就算,又想起了当老板的时光
感谢:http://www.cnblogs.com/terrylee/archive/2006/05/18/403382.html
Proxy模式根据种类不同,效果也不尽相同:
1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
3.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
4.保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。
5.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
6.防火墙(Firewall)代理:保护目标,不让恶意用户接近。
7.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
8.智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
说白了代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途
3.结构
1. 模式的结构
代理模式的主要角色如下。
-
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
-
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
-
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
4.怎么用
来到一个新的地方人生地不熟,第一件事就是找个住处,再做打算
主题 房东想要租出自己空闲的房产
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tV6teJXd-1590459865460)(C:\Users\59759\AppData\Local\Temp\SGPicFaceTpBq\18776\00449242.jpg)]
public interface SeeHouse {
public void renthouse();//出租房产
}
真实主题 于是留下了自己的联系方式,但苦于没有资源平台,久久不能租出去,而且也不知道租房的流程,于是委托给更加专业的中介,由他们全权负责,自己只要收钱就好
//在瑞祥小区的真正房源房东
public class Landlord implements SeeHouse{
@Override
public void renthouse() {
System.out.println("将房出租");
}
}
房产中介 于是委托房产中介 由中介来完成所有的规则 避免和住户直接沟通的麻烦
//中介
public class Proxy implements SeeHouse{
private Landlord realHouse;
@Override
public void renthouse() {
if(realHouse==null){
realHouse=new Landlord();
}
//在正式租房前做的操作
lendhouse();
realHouse.renthouse();
//租房后做的操作
signcontract();
}
private void lendhouse(){
System.out.println("先看房");
}
private void signcontract(){
System.out.println("签合同,收中介费");
}
}
租房用户 直接找的中介介绍了房产
public class ProxyTest {
public static void main(String[] args) {
Proxy proxy=new Proxy();
proxy.renthouse();
}
}