当我们想对一个对象增加功能时一般的做法是对产生该对象的类进行功能扩展,利用扩展之后的类进行实例化进而达到自己的目的。而装饰模式是动态的给对象增加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活(这种灵活性主要体现在客户端)。
装饰模式的一般做法是:第一步,创建一个基类并基于此类创建两个子类:装饰对象类和装饰抽象类,装饰对象类主要用来实例化被装饰的对象(其自身可以包含一些特定功能),装饰抽象类用来产生包含扩展功能的子类。第二步,组织需要添加的功能使其包含在装饰抽象类的子类中。第三步,在客户端利用多态性为装饰对象进行动态添加新功能。(在整个过程中语言的继承和多态的特性是前提保证)
装饰模式的好处是:对于一个类而讲,一些行为功能只有在特殊情况下才能够表现出来,如果为添加这些特殊功能对原有类进行添加字段和功能函数代码只会增加原有类的复杂性,而装饰模式把每个要装饰的功能封装在单独的类中并让这个类包装它所要装饰的对象(这里如何进行包装是需要深入研究的),当需要特殊行为时客户代码就可以在运行时根据需要有选择的,按顺序的为对象添加新功能。这样既可以提高客户端的灵活性又将起装饰作用的功能从原有类中移除,简化了类的设计(单一职责原则),有效地将类的核心职责与装饰功能区分开。 |