示例
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","孩子收拾餐具");
}
}
代理模式和装饰器模式都属于结构型设计模式,然而,他们的使用场景和目的有所不同。
-
代理模式:它为其他对象提供一个代理,从而实现对原对象的访问控制。代理模式的主要目的是控制访问,还可以用于懒加载,提供安全性等。代理模式由四个部分组成:抽象实体,真实实体,代理和客户端。一个具体的例子是网络代理,可以控制对网络资源的访问。
-
装饰器模式:这个模式允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰器模式主要用于扩展一个对象的功能。装饰器模式的主要组件包括:抽象组件,具体组件,抽象装饰器和具体装饰器。一个常见的例子是Java I/O类库,它允许通过连接多种stream类型来装饰文件的读写操作。
总的来说,尽管代理模式和装饰器模式在结构上有些相似,但代理模式主要用于控制对对象的访问,而装饰器模式主要用于在运行时动态地向对象添加更多的职责。