设计模式-装饰模式
程序员文章站
2022-05-17 17:18:31
...
Decorator Pattern,又叫装饰模式。
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点:
(1)装饰对象和真实对象有相同的接口。客户端可以用与真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用(reference)。
(3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
例子:
一个房子要装修,可以分步骤装修,主厅,客厅,厨房,浴室,休息室...如果使用传统的继承,则会产生想当多的子类父类之间的继承,代码的维护管理比较难。
使用装饰模式则可以这样:装饰对象引用一个真实对象,并在装饰之前调用真实对象的方法,从而达到动态的增加修饰的作用;如下图
就像层层递归一样,在装饰之前完成原有真实对象的描述。
代码如下:
如果想调整顺序的话,传统方式将更改大量的代码,而装饰模式只需要调整实现的顺序即可。
代理模式,装饰模式,适配器模式之间的区别:
1、代理模式更多的是过程的控制功能;
2、装饰者模式主要是给被装饰者增加新职责的;
3、适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。
Have a nice Day~
装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰模式的特点:
(1)装饰对象和真实对象有相同的接口。客户端可以用与真实对象相同的方式和装饰对象交互。
(2)装饰对象包含一个真实对象的引用(reference)。
(3)装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
(4)装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
例子:
一个房子要装修,可以分步骤装修,主厅,客厅,厨房,浴室,休息室...如果使用传统的继承,则会产生想当多的子类父类之间的继承,代码的维护管理比较难。
使用装饰模式则可以这样:装饰对象引用一个真实对象,并在装饰之前调用真实对象的方法,从而达到动态的增加修饰的作用;如下图
就像层层递归一样,在装饰之前完成原有真实对象的描述。
代码如下:
package test.patterns.decorator; interface House{ public abstract void decorate(); } class ConcreteHouse implements House{ @Override public void decorate() { System.out.println("准备装修房子..."); } } class Decorator implements House{ public House house; public Decorator() {} public Decorator(House house) { this.house=house; } @Override public void decorate() { house.decorate(); } } class DecoratorKitchen extends Decorator{ public DecoratorKitchen() {} public DecoratorKitchen(House house) { this.house=house; } @Override public void decorate() { super.decorate(); System.out.println("装饰厨房..."); } } class DecoratorRestRoom extends Decorator{ public DecoratorRestRoom() {} public DecoratorRestRoom(House house) { this.house=house; } @Override public void decorate() { super.decorate(); System.out.println("装饰休息室..."); } } class DecoratorMainRoom extends Decorator{ public DecoratorMainRoom() {} public DecoratorMainRoom(House house) { this.house=house; } @Override public void decorate() { super.decorate(); System.out.println("装饰主厅..."); } } public class TestDecorator{ public static void main(String[] args) { House concreteHouse = new ConcreteHouse(); House decorator = new Decorator(concreteHouse); House decoratorMain = new DecoratorMainRoom(decorator); House decoratorKitchen = new DecoratorKitchen(decoratorMain); House decoratorRestRooom = new DecoratorRestRoom(decoratorKitchen); decoratorRestRooom.decorate(); } }
如果想调整顺序的话,传统方式将更改大量的代码,而装饰模式只需要调整实现的顺序即可。
代理模式,装饰模式,适配器模式之间的区别:
1、代理模式更多的是过程的控制功能;
2、装饰者模式主要是给被装饰者增加新职责的;
3、适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。
Have a nice Day~
上一篇: 另辟蹊径的装饰模式(Decorator Pattern)
下一篇: 装饰模式