设计模式之光鲜靓丽的装饰者模式
2019-07-27 本文已影响1人
爪哇部落格
场景介绍
王大哥的女儿刚大学毕业,是一个肤白貌美的程序猿,入职了一家图像处理相关的互联网公司;最近,项目经理要求她对一个图像处理软件进行二次开发,需要在原有的基础上支持添加各种贴图,各种背景图;那么她该如何动手呢?
装饰者模式
我们了解到需求后,知道她需要保持原有的代码和设计,并对原有功能进行扩展使其具有新的功能,于是我们想到了装饰者模式
;装饰者模式的特点便是对原对象进行功能的扩展,同时不改变其结构,是对原有对象的一次包装
。通常在装饰者模式中有如下几种角色:
- Componment 抽象组件
- ConcreteComponment 组件实现类,实现了抽象组件的功能
- Decorator 装饰器,同时持有
Componment
成员变量 - ConcreteDecorator 装饰器功能实现者
我们可以参考如下类图关系:
装饰者类图关系
代码示例
首先我们定义一个Shape
图形接口
public interface Shape {
/**
* 绘画方法
*/
void draw();
}
其次,我们在定义Shape
的实现类Circle
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle");
}
}
关键点来了,我们来装饰我们的Shape
图形
public abstract class ShapeDecorator implements Shape {
protected Shape shape;
public ShapeDecorator(Shape shape) {
this.shape = shape;
}
/**
* 装饰颜色
*/
protected abstract void color();
@Override
public void draw() {
shape.draw();
}
}
最后,装饰者的实现类ColorDecorator
public class ColorDecorator extends ShapeDecorator {
public ColorDecorator(Shape shape) {
super(shape);
}
@Override
public void draw() {
this.color();
super.draw();
}
@Override
protected void color() {
System.out.print("Colorful ");
}
}
让我们编写一个Demo测试一下装饰者的效果:
public class DecoratorDemo {
public static void main(String[] args) {
Shape circle = new Circle();
circle.draw();
ColorDecorator colorfulCircle=new ColorDecorator(circle);
colorfulCircle.draw();
}
}
演示效果如下:
Circle
Colorful Circle
总结
以上我们通过绘制图形,以及给图形装饰颜色对装饰者模式进行了简短的说明;实际上我们在Java IO 中也是随处可见装饰者模式的影子;其中InputStream
相当于组件接口,FileInputStream
是组件的具体的实现类,而FilterInputStream
则是装饰器,BufferedInputStream
是装饰者的具体实现,它在原有的基础上扩展出了缓存的功能。