一。适用场景:在一个现有类增加新的功能的场景,基本的思路是用类的聚合代替继承。该模式和桥接模式比较相似。
二。比如,有一个形状(Shape)接口(interface),定义如下:
package cn.edu.tju.app;
public interface Shape {
void drawIt();
}
其有两个实现类:Rectangle和Circle,
package cn.edu.tju.app;
public class Rectangle implements Shape {
@Override
public void drawIt() {
System.out.println("画长方形");
}
}
package cn.edu.tju.app;
public class Circle implements Shape {
@Override
public void drawIt() {
System.out.println("画圆形");
}
}
现在,要给形状类增加装饰:画笔颜色,定义一个抽象的装饰器类:
package cn.edu.tju.app;
public class AbstractShapeDecorator implements Shape{
Shape shape;
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
}
@Override
public void drawIt() {
shape.drawIt();
}
}
然后,分别定义两个类实现上述的抽象装饰器类,
package cn.edu.tju.app;
public class RedPenShapeDecorator extends AbstractShapeDecorator {
public RedPenShapeDecorator(Shape shape){
super.setShape(shape);
}
@Override
public void drawIt(){
super.drawIt();
System.out.println("画笔的颜色是红色的");
}
}
package cn.edu.tju.app;
public class BlackPenShapeDecorator extends AbstractShapeDecorator {
public BlackPenShapeDecorator(Shape shape){
super.setShape(shape);
}
@Override
public void drawIt(){
super.drawIt();
System.out.println("画笔的颜色是黑色的");
}
}
最后,在主类中分别调用RedPenShapeDecorator类对象以及BlackPenShapeDecorator类对象的drawIt()方法。
package cn.edu.tju.app;
public class DecoratorTest {
public static void main(String[] args) {
AbstractShapeDecorator abstractShapeDecorator1=new BlackPenShapeDecorator(new Rectangle());
AbstractShapeDecorator abstractShapeDecorator2=new RedPenShapeDecorator(new Circle());
abstractShapeDecorator1.drawIt();
abstractShapeDecorator2.drawIt();
}
}
运行结果如下: