Java设计模式 之 装饰者模式

Java设计模式 之 装饰者模式

假设现在有个需求是 统计组装手机花费的时间,组件有电路板,CPU及屏幕这三个,首先我们为三个设计个抽象类,代码如下:

public abstract class Machine {

    // 花费的时间
    abstract int spendTime();   
}

电路板:

public class Board extends Machine {

    @Override
    int spendTime() {
        return 60;
    }

}

A11的处理器:

public class A11CPU extends Machine{

    @Override
    public int spendTime() {
        return 20;
    }

}

OLED屏幕:

public class OLEDScreen extends Machine {

    @Override
    int spendTime() {
        return 120;
    }

}

基本组件已经ok,我们可以开始组装他们,一般来说我们比较简单的做法,会把他们相加,代码如下:

public class PhoneFactory {

    public static void main(String[] args) {
        Machine board = new Board();
        Machine a11CPU = new A11CPU();
        Machine oledScreen = new OLEDScreen();

        //  结果为200
        int spendTime = board.spendTime() + a11CPU.spendTime() + oledScreen.spendTime();
    }
}

我们细细看上班的代码,实现需求是没有问题的,
但假设我们现在需要使用 不同组件 比如 骁龙处理器 或者 Led屏幕 或者 添加其他组装组件 比如扬声器 的时候时我们上述代码扩展就很麻烦,就需要重新修改加一遍,这显然很麻烦。

装饰者模式实现

有没对应的模式可以帮我们解决下?
这时候我们可以试下 装饰者模式,我们可以看到 cpu及屏幕 是装在电路板上的,我们是否可以电路板为基本对象,把 cpu 和 屏幕装 饰到电路板上面,代码如下:

public class A11CPU extends Machine{

    private Machine machine;

    public A11CPU(Machine machine) {
        this.machine = machine;
    }

    @Override
    public int spendTime() {
        // 装饰本地对象
        // 把时间相加
        return 20 + machine.spendTime();
    }

}
public class OLEDScreen extends Machine {

    private Machine machine;

    public OLEDScreen(Machine machine) {
        this.machine = machine;
    }

    @Override
    int spendTime() {
        // 装饰本地对象
        // 把时间相加
        return 120 + machine.spendTime();
    }
}
public class PhoneFactory {

    public static void main(String[] args) {

        Machine machine = new Board();
        machine = new A11CPU(machine);
        machine = new OLEDScreen(machine);

        // 结果为200
        int spendTime = machine.spendTime();
    }
}

假设电路板可以容纳所以组件,把 A11处理器 换成 骁龙处理器 和 OLED 换成 LED屏 也可以较少修改代码。

我们最后来看装饰者模式的定义
装饰者模式:动态将责任附加在对象上,若要扩展功能, 装饰者提供比继承更有弹性的替代方案

可看到我们 动态把责任寄托在 Machine machine 一个对象上,通过添加对象修饰 machine,比如在对象的内部实现相加的方法从而来丰富对象。

源码可参看IO系列的源码,主要是以装饰者模式实现。

其他模式可点击链接进目录阅读了解http://blog.csdn.net/xiao_wanzi94/article/details/78118092

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值