本文共 2661 字,大约阅读时间需要 8 分钟。
声明:本博客里面设计模式相关的文章,均是学习 《大话设计模式》 的笔记。
装饰模式Decorator,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。下面是装饰模式的结构图:
基本的代码实现:
abstract class Component{
public abstract void operation();
}
class ConcreteComponent : Component{
public override void operation(){
具体对象的操作
}
}
abstract class Decorator : Component{
protected Component mComponent;
public void setComponent(Component component){
mComponent = component;
}
public override void operation(){
if(mComponent !=null){
mComponent.operation();
}
}
}
class ConcreteDecoratorA : Decorator{
private String addedState;本类的独有功能,区别与ConcreteDecoratorB
public override void operation(){
base.operation();
addedState = "New State";
具体装饰对象A的操作
}
}
class ConcreteDecoratorB :Decorator{
public override void operation(){
具体装饰对象B的操作
}
private void addeBehavior(){
}
}
客户端代码:
public static void main(String[] args){
ConcreteComponent mConcreteComponent = new ConcreteComponent();
ConcreteDecoratorA mDecoratorA = new ConcreteDecoratorA();
ConcreteDecoratorB mDecoratorB = new ConcreteDecoratorB();
mDecoratorA .setComponent(mConcreteComponent );
mDecoratorB .setComponent(mDecoratorA );
mDecoratorB .operation();
}
装饰模式是利用setComponent来对对象进行包装的,这样每个装饰对象的实现,就和如何使用这个对象分开了,每个装饰对象只关心自己的功能,不需要关心如何添加到对象链当中。
下面以装饰模式来模拟给人穿衣服的功能的具体代码:
package component.decorator;
public class Person { private String name=null; public Person(){ } public Person(String name){ this.name = name; } public void show(){ System.out.println("dress up :"+name); } }服饰类
public class Finery extends Person{
protected Person mPerson =null; public void decorator(Person person){ this.mPerson = person; } @Override public void show() { if(mPerson != null){ mPerson.show(); } } }具体服饰类
public class Tshirts extends Finery {
@Override public void show() { super.show(); System.out.println("dress Tshirts !"); } }public class BigTrouser extends Finery{
@Override public void show(){ super.show(); System.out.println("dress big trouser!"); } }public class DuckHat extends Finery{
@Override public void show(){ super.show(); System.out.println("dress Duck hat!"); } }客户端类
public class DressUpBaby {
public static void main(String[] args){ Person mPerson = new Person("helloBaby"); Tshirts mTshirts = new Tshirts(); BigTrouser mBigtrouser = new BigTrouser(); DuckHat mDuckHat = new DuckHat(); mTshirts.decorator(mPerson); mBigtrouser.decorator(mTshirts); mDuckHat.decorator(mBigtrouser); mDuckHat.show();这里实际上是通过super.show()做的一个递归调用! } }输出结果:
dress up :helloBaby
dress Tshirts !
dress big trouser! dress Duck hat!装饰模式使为已有功能动态的添加更多功能的一种方式。它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,客户端代码可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。
优点就是把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效的把类的核心职责和装饰功能区分开了,而且去除了相关类中重复的装饰逻辑。