《设计模式》之 3 装饰者模式
注意:本文內容大部分參考自文章設計模式詳解——裝飾者模式_簡書
1 裝飾者模式介紹
意圖:向一個現有的對象添加新的功能,同時又不改變其結構。
裝飾者模式的類圖如下:
在裝飾模式中的角色有:
- 抽象構件(Component)角色:給出一個抽象接口,以規范準備接收附加責任的對象。
- 具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。
- 裝飾(Decorator)角色:持有一個構件(Component)對象的實例,并定義一個與抽象構件接口一致的接口。
- 具體裝飾(ConcreteDecorator)角色:負責給構件對象“貼上”附加的責任。
抽象構件角色
public interface Component {public void sampleOperation(); }具體構件角色
public class ConcreteComponent implements Component {@Overridepublic void sampleOperation() {// 寫相關的業務代碼} }裝飾角色
public class Decorator implements Component{private Component component;public Decorator(Component component){this.component = component;}@Overridepublic void sampleOperation() {// 委派給構件component.sampleOperation();} }具體裝飾角色
public class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}@Overridepublic void sampleOperation() {// 寫相關的業務代碼super.sampleOperation();// 寫相關的業務代碼} }2 裝飾者模式實例演示
齊天大圣的例子
孫悟空有七十二般變化,他的每一種變化都給他帶來一種附加的本領。他變成魚兒時,就可以到水里游泳;他變成鳥兒時,就可以在天上飛行。
本例中,Component的角色便由鼎鼎大名的齊天大圣扮演;ConcreteComponent的角色屬于大圣的本尊,就是猢猻本人;Decorator的角色由大圣的七十二變扮演。而ConcreteDecorator的角色便是魚兒、鳥兒等七十二般變化。
抽象構件角色“齊天大圣”接口定義了一個move()方法,這是所有的具體構件類和裝飾類必須實現的。
具體構件角色“大圣本尊”猢猻類
public class Monkey implements TheGreatestSage {@Overridepublic void move() {//代碼System.out.println("Monkey Move");} }抽象裝飾角色“七十二變”
public class Change implements TheGreatestSage {private TheGreatestSage sage;public Change(TheGreatestSage sage){this.sage = sage;}@Overridepublic void move() {// 代碼sage.move();} }具體裝飾角色“魚兒”
public class Fish extends Change {public Fish(TheGreatestSage sage) {super(sage);}@Overridepublic void move() {// 代碼System.out.println("Fish Move");} }具體裝飾角色“鳥兒”
public class Bird extends Change {public Bird(TheGreatestSage sage) {super(sage);}@Overridepublic void move() {// 代碼System.out.println("Bird Move");} }客戶端調用
public class Client {public static void main(String[] args) {TheGreatestSage sage = new Monkey();// 第一種寫法 單層裝飾TheGreatestSage bird = new Bird(sage);TheGreatestSage fish = new Fish(bird);// 第二種寫法 雙層裝飾//TheGreatestSage fish = new Fish(new Bird(sage));fish.move(); } }“大圣本尊”是ConcreteComponent類,而“鳥兒”、“魚兒”是裝飾類。要裝飾的是“大圣本尊”,也即“猢猻”實例。
上面的例子中,第二種些方法:系統把大圣從一只猢猻裝飾成了一只鳥兒(把鳥兒的功能加到了猢猻身上),然后又把鳥兒裝飾成了一條魚兒(把魚兒的功能加到了猢猻+鳥兒身上,得到了猢猻+鳥兒+魚兒)。
如上圖所示,大圣的變化首先將鳥兒的功能附加到了猢猻身上,然后又將魚兒的功能附加到猢猻+鳥兒身上。
總結
以上是生活随笔為你收集整理的《设计模式》之 3 装饰者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P1100高低位交换
- 下一篇: ACE-NODE: Attentive