大话设计模式(二)代理模式
大话设计模式(二)代理模式
前言
代理模式(Proxy Pattern)是GoF 23种Java常用设计模式之一。代理模式的定义:Provide a surrogate or placeholder for another object to control access to it(为其他对象提供一种代理以控制对这个对象的访问)。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
UML类图
角色及其职责
抽象角色:声明真实对象和代理对象的共同接口;
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
举例
下面以一个浅显的例子进行介绍:Proxy喜欢班上的一个女生,但他又不好意思亲自说,于是Proxy请Proxy_帮忙送花,送巧克力等。
问题的解决:“Proxy”和“Proxy_”的方法有相似之处,只不过“Proxy_”送的礼物是“Proxy”买的。
码上说明
-
package cn.edu.ujn.designpattern;
-
-
//公共接口类
-
interface GiveGift
-
{
-
public void givedolls();
-
public void giveflowers();
-
public void givechocolate();
-
}
-
-
//被追求者类
-
class SchoolGirl
-
{
-
private String name;
-
-
public SchoolGirl(String girlName) {
-
this.name = girlName;
-
}
-
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
}
-
-
// 追求者类
-
class Pursuit implements GiveGift {
-
SchoolGirl mm;
-
public Pursuit(SchoolGirl mm) {
-
this.mm = mm;
-
}
-
-
@Override
-
public void givedolls() {
-
System.out.println(mm.getName() + ",送你洋娃娃");
-
}
-
-
@Override
-
public void giveflowers() {
-
System.out.println(mm.getName() + ",送你鲜花");
-
}
-
-
@Override
-
public void givechocolate() {
-
System.out.println(mm.getName() + ",送你巧克力");
-
}
-
-
}
-
// 代理类
-
class Proxy_ implements GiveGift
-
{
-
Pursuit gg;
-
public Proxy_(SchoolGirl mm){
-
gg = new Pursuit(mm);
-
}
-
-
@Override
-
public void givedolls() {
-
gg.givedolls();
-
}
-
-
@Override
-
public void giveflowers() {
-
gg.giveflowers();
-
}
-
-
@Override
-
public void givechocolate() {
-
gg.givechocolate();
-
}
-
}
-
-
public class Proxy{
-
public static void main(String[] args) {
-
SchoolGirl girl = new SchoolGirl("Proxy");
-
Proxy_ demo = new Proxy_(girl);
-
demo.givedolls();
-
demo.giveflowers();
-
demo.givechocolate();
-
}
-
}
代理模式结构图如下:
应用场景
现实世界中,秘书就相当于一个代理,老板开会,那么通知员工开会时间、布置会场、会后整理会场等等开会相关工作就可以交给秘书做,老板就只需要开会就行了,不需要亲自做那些事。同理,在我们程序设计中也可使用代理模式来将由一系列无关逻辑组合在一起的代码进行解耦合,比如业务代码中的日志代码就可以在代理中进行。spring的AOP就是典型的动态代理应用。
应用形式
(1)远程代理(Remote Proxy) -可以隐藏一个对象存在于不同地址空间的事实。也使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。
(2)虚拟代理(Virtual Proxy) – 允许内存开销较大的对象在需要的时候创建。只有我们真正需要这个对象的时候才创建。
(3)写入时复制代理(Copy-On-Write Proxy) – 用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。是虚拟代理的一个变体。
(4)保护代理(Protection (Access)Proxy) – 为不同的客户提供不同级别的目标对象访问权限。
(5)缓存代理(Cache Proxy) – 为开销大的运算结果提供暂时存储,它允许多个客户共享结果,以减少计算或网络延迟。
(6)防火墙代理(Firewall Proxy) – 控制网络资源的访问,保护主题免于恶意客户的侵害。
(7)同步代理(SynchronizationProxy) – 在多线程的情况下为主题提供安全的访问。
(8)智能引用代理(Smart ReferenceProxy) - 当一个对象被引用时,提供一些额外的操作,比如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。
(9)复杂隐藏代理(Complexity HidingProxy) – 用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理(Façade Proxy),这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。
优缺点
优点:详见代理的分类
1)在一定程度上降低了系统的耦合度。
2)代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象也可以对目标对象调用之前进行其他操作。
缺点:
1)在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
2)增加了系统的复杂度。
美文美图
文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。
原文链接:shq5785.blog.csdn.net/article/details/45917421
- 点赞
- 收藏
- 关注作者
评论(0)