標籤:
1.橋樑模式 與 策略模式 非常相似
(其實很多設計模式都相似,因為所有的模式都是按照設計原則 而設計出來的,設計原則就相當於武功的心法,設計模式就是招式,只要心法過硬,就可以無招勝有招了。)
這裡也有比較詳細的說明 策略模式 VS 橋樑模式 (畫畫,使用蠟筆和使用毛筆以及顏料的區別)
好了,這裡先說 橋樑模式,最後再總結兩者的區別
2.橋樑模式(還是那樣,設計模式就是為了代碼健壯,代碼重用,所以高內聚,低耦合永遠都是那麼受歡迎,什麼抽象類別啊,介面啊···)
情境,農民施肥。
這裡農民類 調用 肥料類,用的是組合的方式,也就是農民類中有一個成員屬性是肥料類類型的(就是這裡起到了橋樑的作用),
為了可擴充性,農民類寫成抽象類別,肥料類則寫成介面;
在施肥這個動作中,不僅肥料的種類會變,而且農民這邊也會改變,人工施肥,或者機器施肥等等,所以這裡又兩個可變因子。
而且這兩個可變因子還可以隨機組合的,如 人工施 化肥,人工施有機肥;或者 機器人施化肥,機器人施有機肥。
肥料介面 Manure:
1 package design.patterns.bridge2;2 /**3 * 肥料類4 * */5 public interface Manure {6 void manuring();7 }
View Code
使用介面的原因很簡單,多態嘛
有機肥類,動物肥類 AnimalManure:
1 package design.patterns.bridge2; 2 3 public class AnimalManure implements Manure{ 4 5 @Override 6 public void manuring() { 7 System.out.println("==這是動物肥料,也就是翔····"); 8 } 9 10 }
View Code
化肥類 ChemicalManure:
1 package design.patterns.bridge2; 2 3 public class ChemicalManure implements Manure{ 4 5 @Override 6 public void manuring() { 7 System.out.println("==我是化肥···!"); 8 } 9 10 }
View Code
然後到抽象類別 農民類 Farmer:
1 package design.patterns.bridge2; 2 /** 3 * 農民類 4 * */ 5 public abstract class Farmer { 6 protected Manure manure; 7 8 public Farmer(Manure manure){ 9 this.manure = manure;10 }11 12 abstract void doManuring();13 14 }
View Code
人類農民 HumanFarmer:
1 package design.patterns.bridge2; 2 3 public class HumanFarmer extends Farmer{ 4 5 public HumanFarmer(Manure manure) { 6 super(manure); 7 } 8 9 @Override10 void doManuring() {11 System.out.println("我是大農民,我愛勞動");12 manure.manuring();13 }14 15 }
View Code
當科技發達後,可能會有機器人來施肥的 RobotFarmer:
1 package design.patterns.bridge2; 2 3 public class RobotFarmer extends Farmer{ 4 5 public RobotFarmer(Manure manure) { 6 super(manure); 7 } 8 9 @Override10 void doManuring() {11 System.out.println("機器人也可以施肥的哦。");12 manure.manuring();13 }14 15 }
View Code
最後測試一下 Test類:
1 package design.patterns.bridge2; 2 3 public class Test { 4 public static void main(String[] args){ 5 //開始施肥 6 // //1.準備肥料 7 // Manure manure = new AnimalManure(); 8 //4.突然想施化肥了, 9 Manure manure = new ChemicalManure();10 //2.人工施肥,施的是有機肥, 動物肥11 Farmer farmer = new HumanFarmer(manure);12 // //5.人工施肥,的確較慢,以後會有機器人施肥的13 // Farmer farmer = new RobotFarmer(manure);14 15 16 //3.開工17 work(farmer);18 19 }20 21 public static void work(Farmer farmer){22 farmer.doManuring();23 }24 }
View Code
哎,真的慚愧,感覺我的例子說服力一般,如果理解不了,參考這裡 橋樑模式(Bridge)(不同平台備分不同格式的log檔案)
3.總結:
Strategy(策略模式)是調用者不變,變的只是被調用的方法;(候選模式嘛)
Bridge(橋樑模式)是 調用者和被調用者都可以改變。--可以看成策略模式的加強版(更加一步)
java設計模式之橋樑模式(Bridge)