设计模式——装饰器模式
本质:装饰器模式可以在不使用继承的前提下,对于一个对象添加新的功能。是不是太像iOS的catagory了?
最大的好处,当然是不使用继承的好处。(高耦合)
看看代码:
我们将创建一个Shape接口和实现了Shape接口的实体类。然后我们创建一个实现了Shape接口的抽象装饰类ShapeDecorator,并把Shape对象作为它的实例变量。
RedShapeDecorator是实现了ShapeDecorator的实体类。
DecoratorPatternDemo,我们的演示类使用RedShapeDecorator来装饰Shape对象。
创建一个接口
Shape.java
public interface Shape { void draw(); }
创建实现接口的实体类:
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Shape: Circle"); } }
创建实现了Shape接口的抽象装饰类,ShapeDecorator.java,注意抽象装饰类,既实现了Shape接口,又包含一个Shape类型的属性,前者为了扩展Shape的方法,后者为了通过组合的方式将Shape引入。
public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } }
创建扩展了ShapeDecorator类的实体装饰类,RedShapeDecorator.java
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"); } }
使用RedShapeDecorator来装饰Shape对象,DecoratorPatternDemo.java
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(); } }
验证输出:
Circle with normal border
Shape: Circle
Circle of red border
Shape: Circle
Border Color: Red
Rectangle of red border
Shape: Rectangle
Border Color: Red