动态的给一个对象添加一些额外的职责,就增加功能而言,装饰模式比生成子类更灵活;
Demo:实现对一个人的装扮功能,要求记录穿衣的顺序
public abstract class Human {
public abstract void show();
}
public class Xiaobai extends Human {
@Override
public void show() {
Log.d("meee","小白");
}
}
public class Decoration extends Human {
Human people;
public void setPeople(Human human){
people=human;
}
@Override
public void show() {
if (people!=null){
people.show();
}
}
}
public class XizhuangDecoration extends Decoration{
@Override
public void show() {
Log.d("meee","穿西装的");
super.show();
}
}
public class NiuzaikuDecoration extends Decoration{
@Override
public void show() {
Log.d("meee","穿牛仔库的");
super.show();
}
}
//调用者
Xiaobai xiaobai = new Xiaobai()
XizhuangDecoration xizhuangDecoration = new XizhuangDecoration()
NiuzaikuDecoration niuzaikuDecoration = new NiuzaikuDecoration()
xizhuangDecoration.setPeople(xiaobai)
niuzaikuDecoration.setPeople(xizhuangDecoration)
niuzaikuDecoration.show()
//实现效果
11-07 23:20:46.733 2105-2105/com.junx.designpattem D/meee: 穿牛仔库的
11-07 23:20:46.733 2105-2105/com.junx.designpattem D/meee: 穿西装的
11-07 23:20:46.733 2105-2105/com.junx.designpattem D/meee: 小白
使用场景
装饰模式是为已有功能动态的添加更多功能的一种方式.
这些新加的代码通常装饰了原有的类的核心行为.
在原有类中加入了新的字段 方法和逻辑,从而增加了主类的复杂度,这些新家的东西仅仅是为了满足一些只有有在某种特定情况下的特殊行为的需要.
装饰模式把每个要装饰的功能放在单独的类中,并让这个类去包装它要装饰的对象,从而实现当需要执行特殊行为的时候,客户可以有选择的有顺序的使用装饰功能包装对象
优点:
把类中的装饰功能从类中搬出出去,简化原有的类;
把核心职责和额外功能分开了,并且可以去除相关类中重复的逻辑