代理设计模式
1
什么是代理设计模式?
当某一个对象发生某一个事件时,通知另一个对象,让另一个对象做某事
2
代理例子
家里有一个宝宝Baby,它有两种行为:"哭"cry和"饿"hungry。
代码语言:javascript复制public class Baby{
public void cry(){
}
public void hungry(){
}
}
当"哭"事件发生时我需要去"照顾"look after,当"饿"发生时我需要去"喂"feed。我可以请一个"保姆"nanny来去做这些事,这就是代理
代码语言:javascript复制public class Nanny{
public void lookAfter(){
System.out.println("哄宝宝");
}
public void feed(){
System.out.println("喂宝宝");
}
}
然后保姆任职后
代码语言:javascript复制public class Baby{
public void cry(){
new Nanny().lookAfter();
}
public void hungry(){
new Nanny().feed();
}
}
但是到这里有个问题:当宝宝一哭就雇用一个保姆去照看,当宝宝一饿又新雇佣。宝宝每次触发都要新雇一个。显然这样是不合理的。
代码语言:javascript复制public class Baby{
Nanny nan = new Nanny();
public void cry(){
nan.lookAfter();
}
public void hungry(){
nan.feed();
}
}
改成这样之后,都是由定义好的nan这一个对象来监管,而不是每次都新建一个。但是这样还是存在问题,因为这样写死在Baby里面,也就是说每创建一个Baby对象或者说每一个婴儿出生它内部已经定义了保姆已经绑定了,而保姆应该是后来请的,并且是可以换的。下面开始进行代理设计模式
3
代理模式设计步骤
像上面所说保姆是可换的,但也是要满足代理条件的,也就是当保姆的条件,因为并不是什么人都可以
也就是编写一个规范即接口,只有实现了此接口的才能做对应的代理
代码语言:javascript复制public interface BabyProtocol{
public void lookAfter();
public void feed();
}
public class Baby{
public BabyProtocol nan;
public void cry(){
nan.lookAfter();
}
public void hungry(){
nan.feed();
}
}
这时就需要外界去传一个实现了BabyProtocal接口的对象
代码语言:javascript复制public class Nanny implements BabyProtacol{
public void lookAfter(){
System.out.println("哄宝宝");
}
public void feed(){
System.out.println("喂宝宝");
}
}
代码语言:javascript复制public class Test{
public static void main(String[] args){
Baby baby = new Baby();
baby.nan = new Nanny();
baby.cry();
baby.hungry();
}
}
这样那么才是之后给baby设置保姆,并且可以换,但是要是实现了Babyprotocal的类的对象
4
总结
一个对象的的行为让另一个对象来监听,另一个对象就是代理
步骤:
1.定义好协议
2.遵守协议
3.成为代理
4.触发代理方法
它,
不仅仅是一个码