一)介绍
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
主要解决:在直接访问对象时带来的问题,如服务器安全问题,只能提供代理方式进行访问。
何时使用:在访问一个类时需要做一些控制情况。
如何解决:增加中间层,相当于增加一个代理。
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点:
1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
使用场景:
按职责来划分,通常有以下使用场景:
1、远程代理。
2、虚拟代理。
3、Copy-on-Write 代理。
4、保护(Protect or Access)代理。
5、Cache代理。
6、防火墙(Firewall)代理。
7、同步化(Synchronization)代理。
8、智能引用(Smart Reference)代理。
注意事项:
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
二)UML类图
三)实现
第一步:创建一个访问对象类
package com.oysept.proxy;
public class SchoolGirl {
private String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
第二步:创建一个接口
package com.oysept.proxy;
public interface GiveGift {
void giveDolls();
void giveFlowers();
void giveChocolate();
}
第三步:接口实现的真实请求
package com.oysept.proxy;
public class Pursuit implements GiveGift {
private 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() + ",送你巧克力!");
}
}
第四步:创建一个代理对象类,代理对SchoolGirl对象的访问
package com.oysept.proxy;
public class Proxy implements GiveGift {
private 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();
}
}
第五步:测试
package com.oysept.proxy;
public class Test {
public static void main(String[] args) {
SchoolGirl girl = new SchoolGirl();
girl.setName("MiMi");
Proxy proxy = new Proxy(girl);
proxy.giveDolls();
proxy.giveFlowers();
proxy.giveChocolate();
}
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!