设计模式:10-装饰器模式

一。适用场景:在一个现有类增加新的功能的场景,基本的思路是用类的聚合代替继承。该模式和桥接模式比较相似。
二。比如,有一个形状(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();
    }
}

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值