设计模式08:装饰者模式

装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。

抽象构件角色(Color):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(RedColor):定义一个具体实现类
装饰角色(Pen):持有一个Color对象的实例
具体装饰角色(LargeSizePen、SmallSizePen):负责给构建对象“贴上”附加的责任。UML类图如下:

设计模式08:装饰者模式_第1张图片

color接口

public interface Color {
    public void displayColor();
}

RedColor实现color接口,表示是一个红色的颜色

public class RedColor implements Color {
    public void displayColor(){
        System.out.println("写出的字是红色的!");
    }
}

pen对象是一个装饰者,实现color接口, 并持有一个color的实例

public class Pen implements Color {

    private Color color;

    public Pen(Color color) {
        this.color = color;
    }

    @Override
    public void displayColor() {
        startNewWork();
    }

    public void startNewWork() {
        doEarlyWork();
        color.displayColor();
        doEndWork();
    }

    public void doEarlyWork() {
    }

    public void doEndWork() {
    }

}

LargeSizePen 对象继承 pen对象

public class LargeSizePen extends Pen {

    public LargeSizePen(Color color){
        super(color);
    }

    public void doEarlyWork() {
        System.out.println("大号笔开始写字了...");
    }
    public void doEndWork() {
        System.out.println("大号笔写字了结束...");
    }
}

SmallSizePen也继承pen对象

public class SmallSizePen extends Pen {
    public SmallSizePen(Color color){
        super(color);
    }

    public void doEarlyWork() {
        System.out.println("小号笔开始写字了...");
    }
    public void doEndWork() {
        System.out.println("小号笔写字结束了...");
    }

}

测试类:

public class T {
    public static void main(String args[]) {
        Color color = new RedColor();        //代码工人
        Color largeSizePen = new LargeSizePen(color); //项目经理
        Color smallSizePen = new SmallSizePen(color); //项目经理
        //以经理的名义将编码完成,功劳都是经理的,实际编码的是工人
        largeSizePen.displayColor();
        smallSizePen.displayColor();
    }
}

结果:
>

大号笔开始写字了…
写出的字是红色的!
大号笔写字了结束…
小号笔开始写字了…
写出的字是红色的!
小号笔写字结束了…

你可能感兴趣的:(设计模式,设计模式)