不管是門面模式,適配器模式,還是現在將的橋接模式,核心思想只有一個:就是軟件人員在進行代碼編寫的時候,對於兩個類之間需要進行關聯時,不要直接在一個類的代碼中調用另一個類的代碼,而是要通過這些設計模式,在兩個類之間建立一個類似緩衝器的類,從而將直接關聯的兩個類進行解耦。
橋接模式,顧名思義:就是把兩個類進行關聯,例如現在有兩個類,獎金類-----Bonus ,部門類-----Department. 獎金分爲:個人獎金,團隊獎金,進步獎金。部門分爲:人事部,銷售部,策劃部。如果不使用橋接模式(組合),而使用繼承模式(繼承),來簡歷他們的聯繫。代碼清單如下。
獎金:
public class Bonus(){
public void computerBonus(){
}
}
個人獎金:
public class PeopleBonus extends Bonus{
public void computerBonus(){
System.out.print("正在計算個人獎金");
}
}
團隊獎金:
public class TeamBonus extends Bonus{
public void computerBonus(){
System.out.print("正在計算團隊獎金"):
}
}
進步獎金:省略,
銷售部個人獎金:
public class SalePeopleBonus extends PeopleBonus{
public void computerBonus() {
System.out.println("銷售部個人獎金");
super.computerBonus();
}
}
public class HrPeropleBonus extends PeopleBonus{
public void computerBonus() {
System.out.println("人事部個人獎金");
super.computerBonus();
}
}
策劃部個人獎金:省略。
後面還有:銷售部團隊獎金,人事部團隊獎金,策劃部團隊獎金。
銷售部進步獎金,人事部進步獎金,策劃部進步獎金。
我們發現一個超級嚴重的問題!這個繼承體系很龐大,雖然繼承關係很清晰,但是這些類的關係統統寫死了!!!你改變不得,你一改變父類,子類必要改!例如,現在獎金類-----Bonus,除了要實現計算獎金的功能,還要統計總共發放了多少獎金,一想很簡單呀!so easy!
那不就是這樣:‘
public class Bonus{
public void computerBonus(){
}
//增加第二個方法
public void computerAllMoney(){
}
}
是啊!!很簡單!!但是你後面的子類通通要修改代碼了!!!這下你爽了!!!慢慢改啊。。加油!!!
所以我們發現如果功能發生改變,代碼的一改變,使用繼承關係,子類必受影響。那麼我們現在介紹使用橋接模式來解決這個問題,先分析一下,整個事件中,有兩個關鍵詞:部門+獎金,所以我們現在要解決的就是讓他們之間相互獨立,獨立運作!!各自發生改變都不能影響另一方!這就是我們要的效果。
我們首先定義一個部門接口:
public interface Department {
//定義一個共同的要實現的方法
public void computerBonus();
}
在來定義一個抽象的獎金類,並!並!並!!建立他們之間的連接!!!!
public abstract class Bonus {
private Department department;
public Bonus(Department department){
this.department=department;
}
public void computerBonus(){
department.computerBonus();
}
}
public class HrDepartment implements Department{
@Override
public void computerBonus() {
System.out.println("人事部");
}
}
public class SaleDepartment implements Department{
public void computerBonus() {
System.out.println("銷售部門獎金計算");
}
}
public class 策劃 implements Department{
public void computerBonus() {
System.out.println("策劃部門獎金計算");
}
}
接着是第二大類:獎金:個人獎金+團隊獎金+進步獎金
public class PeopleBonus extends Bonus{
public PeopleBonus(Department department) {
super(department);
}
public void computerBonus() {
System.out.println("正在計算個人獎金:");
super.computerBonus();
}
}
public class TeamBonus extends Bonus{
public TeamBonus(Department department) {
super(department);
}
public void computerBonus() {
System.out.println("正在計算團體獎金");
super.computerBonus();
}
}
那麼你建立他們的時候,就可以使用組合!!!來建立他們
public class Main {
public static void main(String[] args) {
Bonus peopleBonus=new PeopleBonus(new HrDepartment());
peopleBonus.computerBonus();
Bonus teamBonus=new TeamBonus(new HrDepartment());
teamBonus.computerBonus();
}
}
輸出結果:
正在計算個人獎金:
人事部
正在計算團體獎金
人事部