这一篇记录的是设计模式中的代理模式,想象一下生活中租房子的例子,房东出租房子,一般会由中介来替房东出租,中介会收取手续费,这里的中介就相当于代理,租房子的人不可以直接联系房东,而是由中介联系,代理模式就是这么一种模式。
§
一
个客户不想或者不能够直接引用一个对象,而
代理对象
可以在客户端和目标对象之间起到中介的作用,去掉客户不能
看到
的内容和服务或者增添客户需要的额外服务。如在网页上查看一
张图片
,由于网速等原因图片不能立即显示,我们可以在图片传输
过程中
先把一些简单的用于描述图片的文字传输到客户端,此时这些
文字就
成为了图片的代理。
§
代理模式
(Proxy Pattern)
:给某一个对象提供一个代理,并由代理
对象控制
对原对象的引用。代理模式的英文叫做
Proxy
或
Surrogate
。代理
模式
是一种对象结构型模式。
下面用代码来实现代理模式的demo:
Subject类是一个抽象的主题角色,对应于上面租房子的例子中的出租这个主题,中介和房东都有出租房子的方法,下面就是Subject类的代码:
package com.proxy;
//抽象主题角色
public interface Subject {
//出租房子
void rentHouse();
}
房东和中介都可以出租房子,所以房东和中介都必须实现上面的Subject接口,下面是房东的代码:
package com.proxy;
//房东,可以对外出租房子
public class Landlord implements Subject {
@Override
public void rentHouse() {
System.out.println("我是房东,我有房子要出租");
}
}
中介由于代替房东出租房子,所以中介类中应该包含了对房东的引用,代码如下:
package com.proxy;
//房东的代理,可以替房东出租房子
public class Proxy implements Subject {
//包含了对房东对象的引用,中介出租房子时,就调用房东的租房子的方法
private Landlord landlord;
public Proxy(Landlord landlord){
this.landlord = landlord;
}
@Override
public void rentHouse() {
//调用房东租房子的方法,完成代理
landlord.rentHouse();
}
}
下面是测试代码:
package com.proxy;
public class Test {
public static void main(String[] args) {
Landlord landlord = new Landlord();
Proxy proxy = new Proxy(landlord);
proxy.rentHouse();
}
}
代理模式的
优点
如下:
§
代理
模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度。
§
当
对象在远程机器上,要通过网络来生成时速度可能会很慢,此时应用代理
模式
可以掩盖对象在网络上生成的过程,系统的速度会加快。
§
对于
大对象的
加载
(
如
大
图片
)
,
虚拟代理可以让加载过程在后台执行,
前台使用
的代理对象会使得整体运行速度得到优化。
§
代理
模式的缺点是请求的处理速度会变慢
,并且
实现代理模式需要额外的
工作
。
§
代理有以下几种:
§
远程
(
Remote
)代理
§
虚拟
(
Virtual
)代理
§
保护
(
Protector Access
)代理
§
缓冲
(
Cache
)代理
§
防火墙
(
Firewall
)代理
§
同步化
(
Synchronization
)代理
§
智能
引用(
SmartReference
)代理
§
图片代理
AOP(Aspect Oriented Programming)