1. 设计原则
遵循开闭原则:对拓展开放,对修改关闭。
2. 特点:
1、装饰对象和真实对象有相同的接口。
2、装饰对象包含一个真实对象的引用。
3. 优缺点
优点:动态的给一个对象添加一些额外的职责,就扩展功能而言,比生成子类方式更为灵活。
缺点:利用装饰模式,常常造成设计中有大量的子类。(设计模式的通病)
4. 角色组成
1、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2、具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
3、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
4、具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
5 Demo
Component角色
public abstract class Car {
public abstract void drive();
}
Concrete Component角色
public class AodiCar extends Car {
@Override
public void drive() {
Log.e("aodi","开的是奥迪");
}
}
Decorator角色
public abstract class AbsCar extends Car {
public Car car;
public AbsCar(Car car) {
this.car = car;
}
@Override
public void drive() {
car.drive();
}
}
Concrete Decorator角色
public class ConcreateAbsCar extends AbsCar {
public ConcreateAbsCar(Car car) {
super(car);
}
@Override
public void drive() {
super.drive();
drive1();
drive2();
}
private void drive1() {
//do something
}
private void drive2() {
//do something
}
}
client调用
/**
* 装饰设计模式测试:在不改变别人api的情况下,加上自己的实现
*/
public void testWrapper() {
Car car = new AodiCar();
AbsCar absCar = new ConcreateAbsCar(car);
absCar.drive();
}
其实在android源码中:
Activity继承ContextThemeWrapper继承ContextWrapper继承Context——>这种wrapper就是包装的一个体现,具体的在ContextWrapper中的实现都是调用了Context的实现类ContextImpl中的方法。前面说装饰是为了拓展,那么拓展就是由ContextWrapper的具体子类完成,比如Activity,Service,Application。
收工!