裝飾器模式--裝飾模式
1、裝飾模式
裝飾模式:動態的給物件添加一些額外的職責,例如,給相片加各種不同的相框(相框就是裝飾器),
2、裝飾模式的結構
-
角色
-
抽象組件(Component): 抽象組件定義了需要進行裝飾的方法,也就是“被裝飾者”角色;
-
具體組件(ConcreteComponent): 具體組件是抽象主件的一個子類;
-
裝飾(Decorator):裝飾是抽象組件的一個子類,是"裝飾者"角色,其作用是裝飾具體組件,因此”裝飾“角色需要包含”被裝飾者“的參考,它可以是抽象類,也可以是非抽象類;
-
具體裝飾(ConcreteDecorator):具體裝飾是”裝飾“角色的一個非抽象子類,
-
-
類圖

3、裝飾模式舉例
問題:給麻雀安裝智能電子翅膀
抽象組件: Bird.java
1 package com.nick.pattern.decorator; 2 /** 3 * 抽象組件(被裝飾者) 4 * 定義一個介面,介面中包括需要被裝飾的一個抽象方法 5 * @author nick 6 */ 7 public interface Bird { 8 public abstract int fly(); 9 }
具體組件:Sparrow.java
1 package com.nick.pattern.decorator; 2 /** 3 * 具體組件(實作抽象組件) 4 * @author nick 5 */ 6 public class Sparrow implements Bird { 7 public final int DINSTANCE = 100; 8 @Override 9 public int fly() { 10 return DINSTANCE; 11 } 12 }
裝飾器: Decorator.java
1 package com.nick.pattern.decorator; 2 /** 3 * 裝飾(裝飾具體組件,包含被裝飾者的參考) 4 * @author nick 5 */ 6 public abstract class Decorator implements Bird { 7 Bird bird; //參考抽象組件 8 public Decorator(Bird bird) { 9 this.bird = bird; 10 } 11 public abstract int eleFly(); //裝飾器中的裝飾方法 12 }
具體裝飾1:
1 package com.nick.pattern.decorator; 2 /** 3 * 具體裝飾(裝飾者的子類--電子翅膀) 4 * @author nick 5 */ 6 public class SparrowDecorator extends Decorator { 7 public final int DISTANCE = 50; //eleFly()方法(模擬電子翅膀)能飛50米 8 public SparrowDecorator(Bird bird) { 9 super(bird); 10 } 11 @Override 12 public int fly() { 13 int distance = 0; 14 distance = bird.fly() + eleFly(); 15 return distance; 16 } 17 @Override 18 public int eleFly() { 19 return DISTANCE; 20 } 21 }
具體裝飾2:
1 package com.nick.pattern.decorator; 2 /** 3 * 具體裝飾2(噴氣裝置) 4 * @author 5 */ 6 public class SparrowDecorator2 extends Decorator{ 7 public final int DISTANCE = 100; //eleFly()方法(模擬噴氣裝置)能飛20米 8 public SparrowDecorator2(Bird bird) { 9 super(bird); 10 } 11 @Override 12 public int fly() { 13 int distance=0; 14 distance = bird.fly()+eleFly(); 15 return distance; 16 } 17 @Override 18 public int eleFly() { 19 return DISTANCE; 20 } 21 }
主程式:
package com.nick.pattern.decorator; /** * 主程式 */ public class Application { public static void main(String[] args) { Bird bird = new Sparrow(); System.out.println("沒安裝電子翅膀的麻雀能飛行的距離:"+bird.fly()); bird = new SparrowDecorator(bird); System.out.println("安裝1個電子翅膀的麻雀能飛行的距離:"+bird.fly()); bird = new SparrowDecorator(bird); System.out.println("安裝2個電子翅膀的麻雀能飛行的距離:"+bird.fly()); bird = new SparrowDecorator2(bird); System.out.println("安裝1個噴氣裝置后能飛行的距離:" +bird.fly()); } }
運行結果:

4、裝飾器模式的優缺點
-
優點1:被裝飾者和裝飾者是弱耦合關系,由于裝飾依賴于抽象組件,因此具體裝飾只知道它要它要裝飾的物件是抽象組件的某一個子類的實體,但不需要知道具體是哪一個具體的實體,
-
優點2:裝飾模式滿足“開-閉原則”,不必修改具體組件,就可以增加新的針對該組件的具體裝飾,
-
優點3:可以使用多個具體裝飾來裝飾具體組件的實體,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/35314.html
標籤:設計模式
下一篇:設計模式--觀察者模式
