介绍
两者写法相似,但实现的功能有些区别:
装饰,侧重对类的功能扩展,即:扩展其他方法
代理,侧重对类原方法的增强。没有 扩展其他方法
例子
定义接口
定义 IChild
接口,该接口有 eat()
方法
public interface IChild {
void eat();
}
创建实现类
创建 Child
类,实现该接口:
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() {
System.out.println("妈妈喂饭");
child.eat();
System.out.println("妈妈给擦嘴");
}
}
提出新需求
孩子长大了,还要学习
分析
该需求明显是 需要增加新方法,所以通过 装饰器模式 解决
创建孩子扩展(装饰)类:
public class ChildWrapper implements IChild{
private Child child;
public ChildWrapper(Child child){
this.child = child;
}
public void study(String s) {
System.out.println("学习"+s);
}
}
总结
装饰,增加其他方法
代理,对类原方法的之前、之后增加额外代码。没有 增加其他方法