裝飾器模式--裝飾模式 1、裝飾模式 裝飾模式:動態的給對象添加一些額外的職責,例如,給相片加各種不同的相框(相框就是裝飾器)。 2、裝飾模式的結構 角色 抽象組件(Component): 抽象組件定義了需要進行裝飾的方法,也就是“被裝飾者”角色; 具體組件(ConcreteComponent): ...
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:可以使用多個具體裝飾來裝飾具體組件的實例。