装饰模式(Decorator Pattern) – 设计模式之结构型模式:
目录
圆形 Circle 具体构件 ConcreteComponent
装饰模式(Decorator Pattern)
定义: Attach additional responsibilities to an object dynamically keeping the same interface. Decoratiors provide a flexible alternative to subclassing for extending functionality.
动态地给一个对象添加一些额外的职权,就增加功能来说,装饰模式比生成子类更为灵活。 若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
通常装饰模式是采用抽象类,但是在Java中可以使用接口,但我们应避免修改现有的代码。如果抽象类运作得好好的,还是别去修改它。
意图:不改变接口,但是添加责任
类图
装饰模式通用类图:
例子-画图:
过程:
给形状加一些色彩,边框样式,动画等内容
类图:
代码:
形状 Shape
public interface Shape {
void draw();
}
圆形 Circle 具体构件 ConcreteComponent
具体构件 ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("形状是圆形的: ○○○○○");
}
}
三角形 Triangle
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println("形状是三角形的: △△△△△");
}
}
抽象装饰者 Decorator
一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component抽象构件
public abstract class ShapeDecorator implements Shape {
protected Shape shape;
public ShapeDecorator(Shape shape){
this.shape = shape;
}
@Override
public void draw() {
shape.draw();
}
}
粉红色装饰 PinkDecorator
public class PinkDecorator extends ShapeDecorator{
PinkDecorator(Shape shape) {
super(shape);
}
@Override
public void draw() {
shape.draw();
System.out.println(" 涂上粉红色 pink color");
}
}
花环装饰 FlowerDecorator
public class FlowerDecorator extends ShapeDecorator{
FlowerDecorator(Shape shape) {
super(shape);
}
@Override
public void draw() {
shape.draw();
System.out.println(" 给边框加上花环");
}
}
动画装饰 AnimationDecorator
public class AnimationDecorator extends ShapeDecorator{
AnimationDecorator(Shape shape) {
super(shape);
}
@Override
public void draw() {
shape.draw();
System.out.println("加上动画的跳动");
}
}
测试:
public class ShapeDecoratorTest {
public static void main(String[] args) {
System.out.println("======== 圆形 =========");
Shape circle = new Circle();
ShapeDecorator shapeDecorator = new PinkDecorator(new FlowerDecorator(circle));
shapeDecorator.draw();
System.out.println("======== 三角形 =========");
Shape triangle = new Triangle();
shapeDecorator = new AnimationDecorator(new FlowerDecorator(new PinkDecorator(triangle))) ;
shapeDecorator.draw();
}
}
结果:
======== 圆形 =========
形状是圆形的: ○○○○○
给边框加上花环
涂上粉红色 pink color
======== 三角形 =========
形状是三角形的: △△△△△
涂上粉红色 pink color
给边框加上花环
加上动画的跳动
总结:
优点:
装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
使用场景
1,需要扩展一个类的功能,或给一个类增加附加功能。
2,需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3,需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式
装饰模式是对继承的有力补充,可以替代继承,解决类膨胀的问题。