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