在装饰模式下,可以在不更改结构的情况下向现有对象添加新功能。 这种类型的设计模式是结构模式,是作为现有类的包。
此模式创建包装原始类的装饰类,并在保持类方法签名完整性的同时提供其他功能。
以下示例说明装饰器模式的使用方法。 在其中,我们将一个形状装饰成不同的颜色,同时不改变形状的类别。
1、意图
动态地向对象添加功能。 装饰者模式是一种代替继承的技术,继承可以在不添加子类的情况下扩展对象的新功能。 使用对象关系而不是继承关系可以提供更大的灵活性,并避免类型体系的快速膨胀。
2、适用环境
以动态和透明的方式将责任添加到各个对象,而不影响其他对象
处理可撤销的责任
无法通过生成子类的方法进行扩展时。 一种情况是可能有许多独立的扩展,会生成许多子类以支持每个组合,子类的数量会呈爆炸式增长。 另一种情况是类定义被隐藏,或者类定义不能用于生成子类。
3、键码
Component类起到抽象的作用,不应该具体实现。
限定类引用并继承Component类。 具体的扩展类重写父类方法。
适用例
1、wmdcjl有72个变化,他成为“寺院”后,他的根本还是猴子,但他有寺院的功能。 2、一幅画无论有无画框都可以挂在墙上,通常有画框,实际上画框是挂在墙上的。 挂在墙上之前,可以用玻璃覆盖画并放进框里; 这时,画、玻璃和画框形成了一个物体。
注意:可以代替继承。
4、参与者
抽象组件的作用)
由于真实对象和装饰对象具有相同的接口,因此客户端对象可以像与真实对象一样与装饰对象进行交互。
ConcreteComponent (具体组件的作用,即实际对象) )。
IO流的文件输入流、文件输出流
角色)。
有抽象要素的引用。 装饰对象接受所有客户端的请求,并将这些请求转发给实际对象。 这样就可以在实际对象调用之前和之后添加新功能。
ConcreteDecorator (具体的装饰角色) ) )。
对部件的对象施加新的责任。
5、类图
六、与作用有关的
抽象组件:定义用于指定准备附加功能的类的抽象接口。
具体组件:在附加功能的类中,实现抽象组件的角色界面。
抽象装饰者:具有对具体构成要素的作用的引用,定义与抽象构成要素的作用一致的接口。
具体装饰:负责实现抽象装饰者的作用,为具体构件增加额外的功能。
7、代码实现
一.建立接口
//Shape.java
公共界面形状{
void draw (;
}
二、创建实现接口的实体类。
//Rectangle.java
publicclassrectangleimplementsshape {
@Override
公共void draw (
system.out.println (shape : rectangle );
}
}
//Circle.java
publicclasscircleimplementsshape {
@Override
公共void draw (
system.out.println (shape : circle );
}
}
三、创建实现Shape接口的抽象装饰类。
//ShapeDecorator.java
publicabstractclassshapedecoratorimplementsshape {
受保护的形状解码的形状;
publicshapedecorator (shapedecoratedshape ) (
this.decorated shape=decorated shape;
}
公共void draw (
decoratedShape.draw (;
}
}
四.创建扩展了ShapeDecorator类的实体装饰类。
//RedShapeDecorator.java
publicclassredshapedecoratorextendsshapedecorator {
公共字符解码器(shapedecorator )。
super (已解码形状;
}
@Override
公共void draw (
decoratedShape.draw (;
setredborder (已解码形状;
}
私有卷影(shapedecoratedshape )。
system.out.println (border color : red );
}
}
五.使用RedShapeDecorator装饰Shape对象。
publicclassdecoratorpatterndemo {
publicstaticvoidmain (字符串[ ] args ) {
Shape circle=new Circle (;
shapedecoratorredcircle=newredshapedecorator (new circle ) );
shapedecoratorredrectangle=newredshapedecorator (new rectangle ) );
//shaperedcircle=newredshapedecorator (new circle ) );
//shaperedrectangle=newredshapedecorator (new rectangle () );
system.out.println (circlewithnormalborder );
circle.draw (;
system.out.println (ncircleofredborder );
redCircle.draw (;
system.out.println (rectangleofredborder );
redRectangle.draw (;
}
}
六.运行程序并输出结果
Circle with normal border
形状:轮廓
Circle of red border
形状:轮廓
border color :红色
Rectangle of red border
形状:回复
border color :红色
8、优缺点
1 .好处
装饰类和被装饰类可以独立发展而不相互结合,装饰模式是继承的替代模式,装饰模式可以动态扩展安装类的功能。
2 .坏处
多层装饰比较复杂。
3 .实际使用
其中,在java中I/O使用装饰者模式。
4 .装饰装修人员使用的设计原则:
多使用组合,少继承。
对扩张开放,对修正关闭。