// 孩子会吃饭
public interface IChild {
void eat();
}
// 孩子类,实现吃饭接口
public class Child implements IChild{
@Override
public void eat() {
Log.e("TAG","孩子吃饭");
}
}
// 父母(代理)类(代理帮助孩子正确处理吃饭流程)
public class Parent implements IChild{
private Child child;
private Parent(Child child){
this.child = child;
}
@Override
public void eat() {
Log.e("TAG","父母做饭");
child.eat();
Log.e("TAG","父母收拾餐具");
}
}
// 孩子扩展(装饰)类(孩子能自理)
public class ChildWrapper implements IChild{
private Child child;
public ChildWrapper(Child child){
this.child = child;
}
@Override
public void eat() {
Log.e("TAG","孩子做饭");
child.eat();
Log.e("TAG","孩子收拾餐具");
}
}
// 以上是代理和装饰的简化写法,差别几无。但是代理模式偏重于对对象的控制,装饰模式侧重于对原对象功能的扩展,扩展后的对象仍是是对象本身。
- 代理模式,注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何。
- 装饰模式,注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身。
- 对于代理类,如何调用对象的某一功能是思考重点,而不需要兼顾对象的所有功能;
- 对于装饰类,如何扩展对象的某一功能是思考重点,同时也需要兼顾对象的其它功能,因为再怎么装饰,本质也是对象本身,要担负起对象应有的职责。
- 被装饰者一旦身份增加,作为装饰类,也需要相应的扩展,这必然造成编码的负担。