装饰模式(Decorator),亦可以理解为包装,就是一层层对原对象添加功能
定义:
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
特点:
装饰类(包装类)实现或继承原对象的接口或抽象类,又同时保持其引用;这样就可以设计很多装饰类的子类,每个子类就可以进行一次装饰或包装,就可以将原对象一层层地进行包装。
示例:
人形象装扮示例:
代码:
/**
* 装饰对象
*/
public class Person {
private final static String TAG = "Person";
private String mName;
public Person() {}
public Person(String name) {
mName = name;
}
public void show() {
Log.d(TAG, "这是" + mName + ", 它穿着 ");
}
}
/**
* 装饰类:继承Person,同时保持Person的引用
*/
public class Decorator extends Person {
private final static String TAG = "Decorator";
private Person mPerson;
public Decorator() {}
public Decorator(String name) {
super(name);
}
public void setPerson(Person person) {
mPerson = person;
}
@Override
public void show() {
mPerson.show();
}
}
import android.util.Log;
/**
* 装饰TShirt
*/
public class TShirts extends Decorator {
private final static String TAG = "TShirts";
public TShirts() {}
public TShirts(String name) {
super(name);
}
@Override
public void show() {
super.show();
Log.d(TAG, " TShirt ");
}
}
import android.util.Log;
/**
* 装饰鞋子
*/
public class Shoes extends Decorator {
private final static String TAG = "Shoes";
public Shoes() {}
public Shoes(String name) {
super(name);
}
@Override
public void show() {
super.show();
Log.d(TAG, " Shoes ");
}
}
调用代码:
Person Gavin = new Person("Gavin");
TShirts ts = new TShirts();
Shoes sh = new Shoes();
//装饰过程
ts.setPerson(Gavin);
sh.setPerson(ts);
//展示
sh.show();
输出结果:
D/Person: 这是Gavin, 它穿着 TShirt Shoes
最后展示的过程就是,一层层包装的解包显示过程。