装饰器模式
定义
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
首先我们先来定义一个使用场景(画图功能),并模拟需求变更过程。
NOTE:程序的设计重要性
一. 初次设计:只需要画出图形就可以(比如:正方形,圆形)
- 定义一个接口
package com.devil.java.decorator;
/**
*
* @author devil 定义一个形状的画图接口
*/
public interface Shape {
/**
* 画图接口,直接画出图形
*/
public void draw();
}
- 实现一个矩形
package com.devil.java.decorator;
/**
*
* @author devil 定义一个矩形的实体类
*/
public class Rectangle implements Shape {
@Override
public void draw() {
// 画图的功能根据实际的业务来在做处理,这里只做一个简单的打印信息处理
System.out.println("画出了一个矩形!");
}
}
- 测试
package com.devil.java.decorator;
/**
*
* @author devil 设计模式的主入口
*/
public class DecoratorMain {
public static void main(String[] args) {
// 画一个矩形
Shape shape = new Rectangle();
// 实际画图
shape.draw();
}
}
- 输出
画出了一个矩形!
二. 需求变更: 画图时还需要有填充色(比如:红色,绿色)
分析新添加的需求
画出矩形的功能已经有了(NOTE:相同的代码不需要在重复编写),需要添加一个填充颜色的功能
- 定义一个画图的装饰器
package com.devil.java.decorator;
/**
*
* @author devil 定一个画图的装饰器
*/
public abstract class ShapeDecorator implements Shape {
/**
* 画图(NOTE:public private protected default的区别根据实际情况使用)
*/
protected Shape shape;
/**
* 添加一个构造函数
*
* @param shape
* 画图
*/
public ShapeDecorator(Shape shape) {
this.shape = shape;
}
}
- 矩形装饰器的具体实现
package com.devil.java.decorator;
public class RectangleDecorator extends ShapeDecorator {
// 默认的填充颜色
private String color = "白色";
/**
* 默认的构造函数
*
* @param shape
* 画图
*/
public RectangleDecorator(Shape shape) {
super(shape);
}
/**
* 带颜色的构造函数
*
* @param shape
* 画图
* @param color
* 颜色
*/
public RectangleDecorator(Shape shape, String color) {
super(shape);
this.color = color;
}
@Override
public void draw() {
// 调用原始的画图方法
this.shape.draw();
// 新建的颜色填充方法
this.fullColor();
}
/**
* 新添加的功能填充颜色
*/
private void fullColor() {
System.out.println("填充的颜色是:" + this.color);
}
}
- 测试
package com.devil.java.decorator;
/**
*
* @author devil 设计模式的主入口
*/
public class DecoratorMain {
public static void main(String[] args) {
System.out.println("<简单只画图>");
// 画一个矩形
Shape shape = new Rectangle();
// 实际画图
shape.draw();
System.out.println("..............................");
System.out.println("");
System.out.println("<需求变更后>");
// 画一个默认填充色的矩形
Shape shape1 = new RectangleDecorator(new Rectangle());
shape1.draw();
System.out.println("..............................");
System.out.println("");
// 画一个给定颜色为蓝色的矩形
Shape shape2 = new RectangleDecorator(new Rectangle(), "蓝色");
shape2.draw();
}
}
- 输出
这里写代码片<简单只画图>
画出了一个矩形!
..............................
<需求变更后>
画出了一个矩形!
填充的颜色是:白色
..............................
画出了一个矩形!
填充的颜色是:蓝色
总结
现在的java编程都是面向对象和接口编程,调用者之需要知道调用shape的draw方法可以画出图形(NOTE:因为这接口在这之前就已经定义好),至于调用有填充色的画图还是没有填充色的画图这是一个选择问题,但是对于我们添加填充色功能来说不能改变原先的程序设计结构,换句话说就是,调用draw就可以画图(有颜色或者没有颜色),这个是没有改变的。
代码的实现都是其次的重要的是理解这种设计模型的意义和作用。