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