裝飾模式:動態的給對象添加一些額外的職責,例如,給相片加各類不一樣的相框(相框就是裝飾器)。java
角色ide
抽象組件(Component): 抽象組件定義了須要進行裝飾的方法,也就是「被裝飾者」角色;this
具體組件(ConcreteComponent): 具體組件是抽象主件的一個子類;spa
裝飾(Decorator):code
具體裝飾(ConcreteDecorator):具體裝飾是」裝飾「角色的一個非抽象子類。對象
類圖blog
問題:給麻雀安裝智能電子翅膀接口
抽象組件: Bird.javait
1 package com.nick.pattern.decorator; 2 /** 3 * 抽象組件(被裝飾者) 4 * 定義一個接口,接口中包括須要被裝飾的一個抽象方法 5 * @author nick 6 */ 7 public interface Bird { 8 public abstract int fly(); 9 }
具體組件:Sparrow.javaio
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()); } }
運行結果:
優勢1:被裝飾者和裝飾者是弱耦合關係,因爲裝飾依賴於抽象組件,所以具體裝飾只知道它要它要裝飾的對象是抽象組件的某一個子類的實例,但不須要知道具體是哪個具體的實例。
優勢2:裝飾模式知足「開-閉原則」。沒必要修改具體組件,就能夠增長新的針對該組件的具體裝飾。
優勢3:能夠使用多個具體裝飾來裝飾具體組件的實例。