Java设计模式之代理模式
一、什么是代理模式
1.1 代理模式简介
在某些情况,某个对象需要对调用者不直接公开调用接口,而是通过代理对象进行请求,避开对真实对象的访问。这种设计模式被称为——代理模式,在Android源码Frameworks层大量使用了代理模式进行代码设计,我们经常使用的×××Manager类都是代理×××ManagerService服务接口类。可阅读我写的另一篇关于框架层系统服务的博客:
1.2 代理模式角色组成
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可附加其他操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可附加其他操作。
1.3 代理模式的优点
1、职责清晰:
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
2、提高安全:
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
2、提高安全:
代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
3、高扩展性:
代理角色实现抽象角色现有的接口的方法之后,还可以在现原有基础上进行功能扩展,而不用去改动抽象角色接口。
3、高扩展性:
代理角色实现抽象角色现有的接口的方法之后,还可以在现原有基础上进行功能扩展,而不用去改动抽象角色接口。
二、应用场景举例及代码实现
抽象角色:面膜
真实角色:老板
代理角色:微商
2.1 抽象角色 首先假设定义国家面膜标准接口
public interface FacialMask {
public void Replenishment();// 补水
public void Moisture();// 保湿
}
public class FacialMaskBossA implements FacialMask {
@Override
public void Replenishment() {
System.out.println("[面膜老板A] 补水面膜");
}
@Override
public void Moisture() {
System.out.println("[面膜老板A] 保湿面膜");
}
}
public class FacialMaskBossB implements FacialMask {
@Override
public void Replenishment() {
System.out.println("[面膜老板B] 补水面膜");
}
@Override
public void Moisture() {
System.out.println("[面膜老板B] 保湿面膜");
}
}
2.3
代理角色 微商面膜代理,遵守国家标准实现接口,消费者选择的品牌通过构造函数传递,最后调货
public class WeChat implements FacialMask {
FacialMask mFmImpl;
public WeChat(FacialMask fmImpl) {
mFmImpl = fmImpl;
}
@Override
public void Replenishment() {
this.mFmImpl.Replenishment();
}
@Override
public void Moisture() {
this.mFmImpl.Moisture();
}
}
public static void main(String[] args) {
// 代理面膜老板A
FacialMask fma = new FacialMaskBossA();
WeChat wcaa = new WeChat(fma);
wcaa.Moisture();
// 代理面膜老板B
FacialMask fmb = new FacialMaskBossB();
WeChat wcab = new WeChat(fmb);
wcab.Moisture();
}
输出结果:
[面膜老板A] 保湿面膜
[面膜老板B] 保湿面膜