** 2019-12-05 17:45:11 **
代理模式-Java设计模式(五)
代理模式
为其他对象提供一种代理以控制对这个对象的访问
何时使用
想在访问一个类时做一些控制。
如何解决
增加中间层。
关键代码
实现与被代理类组合。
优缺点
优点: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、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。
代码 & 结构图
小明想托我帮他送礼物给女神。
【送礼物】接口
/**
* 送礼物接口
*/
public interface Gifts {
/**
* 送花
*/
void flower();
/**
* 送巧克力
*/
void chocolate();
}
【女神类】
/**
* 女神
*/
@Data
public class Girl {
// 名称
private String name;
}
【小明类】
/**
* 小明想送礼物给 女神
* 实现了送礼物接口
*/
public class XiaoMing implements Gifts {
private Girl girl;
XiaoMing(Girl girl) {
this.girl = girl;
}
@Override
public void flower() {
System.out.println(girl.getName() + ",送你花花~");
}
@Override
public void chocolate() {
System.out.println(girl.getName() + ",送你巧克力~");
}
}
【代理类】相当于我
/**
* 代理类,相当于我,帮小明送
* 实现了送礼物接口
*/
public class Proxy implements Gifts {
private XiaoMing xiaoMing;
// !!!注意!!!new小明,带入女神
Proxy(Girl girl) {
this.xiaoMing = new XiaoMing(girl);
}
// 调用小明送礼物方法
@Override
public void flower() {
xiaoMing.flower();
}
@Override
public void chocolate() {
xiaoMing.chocolate();
}
}
测试
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
Girl girl = new Girl();
girl.setName("红红");
Proxy proxy = new Proxy(girl);
proxy.flower(); // 红红,送你花花~
proxy.chocolate(); // 红红,送你巧克力~
}
}
UML结构图
源码 - proxy分支
不同分支对应不同设计模式源码 github.com/nullaman/Ja…