《大话设计模式》之装饰模式

来源:互联网 发布:nginx 跳转到指定端口 编辑:程序博客网 时间:2024/05/17 04:40

1.定义

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

2.针对问题

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
装饰模式是为已有功能动态地添加更多功能的一种方式。
何时使用:

1)取代因基本功能的排列组合而产生非常大量的类2)需要动态的给一个对象增加功能,这些功能可以再动态地撤销。3)某个对象的职责经常发生变化或者经常需要动态添加职责,避免为了适应这种变化造成的继承拓展方法.

优点:有效地把类中的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。

3.实现

这里写图片描述

//相当与Component,定义一个对象接口,可以给这些对象动态地添加职责public interface Operation {    public void show();}
//相当于ConcreteComponent,定义一个具体的对象,可以给这个对象添加新的职责public class Person implements Operation{    private String name;    public Person(String name) {        this.name = name;    }    @Override    public void show() {                System.out.println(name+"穿了:");    }}
//相当于Decorator,装饰类public class Finery implements Operation{    private Operation operation;    public Finery(Operation operation) {        super();        this.operation = operation;    }    @Override    public  void show() {        if(operation!=null) {            operation.show();        }    }}
//具体的装饰对象,起到给Componet添加职责的功能public class TShirts extends Finery {    public TShirts(Operation operation) {        super(operation);    }       @Override    public void show() {        super.show();        System.out.print("big TShirts***");         }}public class BigThrouser extends Finery {    public BigThrouser(Operation operation) {        super(operation);    }    public void show() {        super.show();        System.out.print("BigThrouser***");    }}
//调用public class Maintest {    public static void main(String[] args) {        Operation person=new Person("ting");        person=new BigThrouser(person);        person=new TShirts(person);             person.show();    }}