Java装饰者模式
1 Java装饰者模式的介绍
装饰者模式允许用户向现有对象添加新功能而不改变其结构。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装器。
此模式创建一个装饰器类,它包装原始类并提供附加功能,保持类方法签名完整。
我们通过以下示例展示装饰器模式的使用,其中我们将用一些颜色装饰形状而不改变形状类。
2 Java装饰者模式好处
- 装饰者模式提供了比静态继承更大的灵活性。
- 因为可以通过对新类进行编码来进行更改,所以可以增强对象的可扩展性。
- 装饰者模式允许您从目标类开发一系列功能,而不是将所有行为编码到对象中,从而简化了编码。
3 Java装饰者模式的用法
- 当您想透明,动态地向对象添加职责而又不影响其他对象时。
- 当您想向对象添加职责时,将来可能需要更改。
- 通过子类扩展功能不再可行。
4 Java装饰者模式的UML
在这个实例中,将创建一个Shape接口和实现Shape接口的具体类。然后再创建一个抽象装饰器类-ShapeDecorator,实现Shape接口并使用Shape对象作为其实例变量。
这里的RedShapeDecorator是实现ShapeDecorator的具体类。
DecoratorPatternDemo这是一个演示类,将使用RedShapeDecorator来装饰Shape对象。
5 Java装饰者模式的案例
5.1 创建一个简单的接口
Shape.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public interface Shape {
void draw();
}
5.2 创建两个实现相同接口的具体类
Rectangle.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
Circle.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
5.3 创建实现Shape接口的抽象装饰器类
ShapeDecorator.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
5.4 创建扩展ShapeDecorator类的具体装饰器类
RedShapeDecorator.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
5.5 使用RedShapeDecorator装饰Shape对象
DecoratorPatternDemo.java:
/**
* 一点教程网: http://www.yiidian.com
*/
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
5.6 输出结果
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red
热门文章
优秀文章