Java设计模式 之 装饰者模式

来源:互联网 发布:insar数据处理软件 编辑:程序博客网 时间:2024/06/03 16:04

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

原创粉丝点击