JAVA設計模式——(三)橋接模式(Bridge Pattern)
- 介紹
- 理解
- 實現
- 武器抽象類
- 武器實現類
- 涂裝顏色的行為接口
- 具體顏色的行為實現
- 讓行為影響武器
- 修改武器抽象類
- 修改實現類
- 測試
- 適用性
介紹
將抽象和實現解耦,使兩者可以獨立的變化。
理解
在這里需要理解的是如何讓抽象和實現進行解耦。再具體編碼代碼時,抽象類一般用以定義一些對象的公共基類,公共基類包含一些共同屬性或者一些通用實現方法,或者一些子類待實現的方法;接口則用于規范實現類的行為方法。
對于一個武器(實現類),制作一把武器需要模具(抽象類),假如我們需要拓展武器,讓武器可以組裝其他的組件,比如彈夾、槍管,那我們是否需要重新打造一個模具(抽象類),那這樣做豈不是每次的改動都需要更改模具,讓工作變得繁重。所以,有沒有一種辦法直接對實現類修改,有的。
直接修改實現類,我們可以直接更換槍管、更換彈夾等行為,即對實現類的直接修改(工作臺一樣)。這樣就直接避免修改抽象類,轉而通過工作臺修改(即定義其他的行為)。
實現
武器抽象類
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 15:59* @Contact 643947568@qq.com*/
public abstract class AbstractWeapon {public abstract void createWeapon();}
武器實現類
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 16:01* @Contact 643947568@qq.com*/
public class Weapon extends AbstractWeapon{@Overridepublic void createWeapon() {System.out.println("生產具有八倍鏡的武器");}
}
涂裝顏色的行為接口
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 16:07* @Contact 643947568@qq.com*/
public interface Color {public void getColor(); //繪制槍的顏色
}
具體顏色的行為實現
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 16:11* @Contact 643947568@qq.com*/
public class Green implements Color {@Overridepublic void getColor() {return "綠色";}
}
讓行為影響武器
如何讓行為影響武器,是值得思考的問題。為了讓武器的顏色得到改變,一種方法武器和顏色傳送給Color類涂裝,另一種是將定義的顏色傳給武器進行涂裝。
當然,選擇第二種是更好的。由于顏色是預先定義的,而不是根據顏色需求來定制顏色。另外,武器的組裝線在武器類里面,難道你會把武器送給顏料廠進行涂裝嗎?肯定不會吧。
修改武器抽象類
讓武器類具有顏色屬性
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 15:59* @Contact 643947568@qq.com*/
public abstract class AbstractWeapon {Color color;public AbstractWeapon(Color color) {this.color = color;}public abstract void createWeapon();}
修改實現類
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 16:01* @Contact 643947568@qq.com*/
public class Weapon extends AbstractWeapon {public Weapon(Color color) {super(color);}@Overridepublic void createWeapon() {System.out.println("生產具有八倍鏡的武器");System.out.println("涂裝顏色" + color.getColor());}
}
測試
package cn.sh.designepattern.example02;/*** @Author song* @Version 0.0.1* @Date 2025/4/23 15:59* @Contact 643947568@qq.com*/
public class Main {public static void main(String[] args) {Color green = new Green(); //定義顏色Weapon weapon = new Weapon(green); //將顏色傳給武器weapon.createWeapon();}
}
適用性
進過上面的例子,因該很好理解橋接模式的運用。
橋接模式更偏向運用組合的方式,將實現細節從本體中抽離出來,從而將顏色的實現細節從武器的生產線抽離,而無需
關心其中部分的實現,只需要得到這部分的屬性即可。
如果我們直接采用實現的方式,讓武器具有顏色的行為,就好比把武器組裝線中,塞一個顏色的加工廠一樣,臃腫,也沒有解耦合。此外,直接實現Color接口的方式,會使得每次顏色類的變動,均會影響實現的子類,均需要重寫接口的抽象方法。