看我七十二变
有近2星期沒有寫文章了,各種原因吧,主要是懶。
今天接著寫吧,今天寫一個孫悟空的七十二變。
變樹、變房、變小女孩
我們會用到裝飾模式,裝飾模式是結(jié)構(gòu)型設(shè)計模式的一種。
裝飾模式也可以叫包裝(Wrapper)模式,我對他的理解就是他替代了繼承操作。
比如我們寫一個孫悟空七十二變的例子,用繼承是這么做的:
代碼很簡單就不寫了,類圖是這樣子的
一、裝飾模式類圖
- 抽象構(gòu)件(Component)角色:這是一個抽象接口,用以規(guī)范準(zhǔn)備附加責(zé)任的對象
- 具體構(gòu)件(ConcreteComponent)角色:這是一個具體的準(zhǔn)備接受附加責(zé)任的對象
- 裝飾(Decorator)角色:這是一個抽象修飾類,他持有一個Component對象
- 具體裝飾(ConcreteDecorator)角色:負(fù)責(zé)給持有對象Component附加責(zé)任
那具體到我們這個七十二變的例子中類圖是什么樣的呢?
注意:不要太在意這里的繼承和實現(xiàn),我們開發(fā)中可以用抽象類子類繼承,也可以用接口然后編寫實現(xiàn)
二、讓我們變(編)起來
取經(jīng)人:
package decorate;/*** @author 木子的晝夜編程*/ public interface BibleReader {void change(); }豬八戒、孫悟空:
package decorate;/*** @author 木子的晝夜編程*/ public class SunWuKong implements BibleReader{@Overridepublic void change() {System.out.print("孫悟空");} } package decorate;/*** @author 木子的晝夜編程*/ public class ZhuBaJie implements BibleReader{@Overridepublic void change() {System.out.print("豬八戒");} }裝飾類:
package decorate;/*** @author 木子的晝夜編程*/ public abstract class Decorator implements BibleReader {BibleReader bb ;public Decorator(BibleReader bb) {this.bb = bb;}@Overridepublic void change(){if (bb != null) {bb.change();}} }裝飾變樹:
package decorate;/*** @author 木子的晝夜編程*/ public class TreeDecorator extends Decorator{public TreeDecorator(BibleReader bb) {super(bb);}// 獨有的裝飾方式private void myDecorator(){System.out.println("--變樹!!");}@Overridepublic void change(){if (bb != null) {bb.change();}myDecorator();} }裝飾變房子:
package decorate;/*** @author 木子的晝夜編程*/ public class HouseDecorator extends Decorator{public HouseDecorator(BibleReader bb) {super(bb);}// 獨有的裝飾方式private void myDecorator(){System.out.println("--變房子!!");}@Overridepublic void change(){if (bb != null) {bb.change();}myDecorator();} }裝飾變小女孩:
package decorate;/*** @author 木子的晝夜編程*/ public class GirlDecorator extends Decorator{public GirlDecorator(BibleReader bb) {super(bb);}// 獨有的裝飾方式private void myDecorator(){System.out.println("--變小女孩!!");}@Overridepublic void change(){if (bb != null) {bb.change();}myDecorator();} }開始變:
package decorate;/*** @author 木子的晝夜編程*/ public class TestChange {public static void main(String[] args) {// 孫悟空本空SunWuKong sunWuKong = new SunWuKong();// 豬八戒本豬ZhuBaJie zhuBaJie = new ZhuBaJie();// 孫悟空變小女孩裝飾類GirlDecorator girlDecorator = new GirlDecorator(sunWuKong);girlDecorator.change();// 孫悟空變房子裝飾類HouseDecorator houseDecorator = new HouseDecorator(sunWuKong);houseDecorator.change();// 豬八戒變小女孩GirlDecorator girlDecoratorZhuBajie = new GirlDecorator(zhuBaJie);girlDecoratorZhuBajie.change();// 豬八戒變樹TreeDecorator treeDecorator = new TreeDecorator(zhuBaJie);treeDecorator.change();} }三、還有誰?
這時候如果沙悟凈也想變,那我們只需要定義一個BibleReader的子類,然后就可以給他裝飾各種變換
不用再針對每種變換再定義子類。
這就是我開頭說的,我理解裝飾就是用聚合代替了繼承
看到這里是不是覺得它很像代理模式,橋接模式?
是的!
等你全部領(lǐng)悟了之后,可以達(dá)到心中無劍手中有劍,也就是你沒想著用某種設(shè)計模式,但是你寫出來的代碼已經(jīng)符合了某種設(shè)計模式。
比如: 1+1=2
比如:有人伸手打你,你會出手阻擋
比如:時間到了10點50 ,你就拿手機定外賣
總結(jié)
- 上一篇: 问题1084:搭数字Ⅰ
- 下一篇: Css知识回顾