橋接模式的英文是 Bridge ,橋接模式關注抽象的設計。抽象是指包含了一組抽象方法的類,這些抽象方 法可能包含多個實現。
實現抽象的一般做法是創建類的層次結構,該層次結構的頂部是一個包含抽象 方法的抽象類,該類的每一個子類都提供這些抽象方法的不同實現。但是,當需要對該層次進行子類化時,這 一做法就存在不足了。
你可以創建一個橋,然後把這些抽象方法移到接口中,這樣,抽象就依賴於接 口的實現。
橋接模式的意圖是:將抽象與抽象方法的實現相互分離來實現解耦,以便二者可以相互獨 立的變化。
上面這段話的意思就是說實現與抽象相分離。
下面舉個例子說明:
1.現在 水果裡有 蘋果和橘子
2.人分為 男人和女人
3.人都可以吃水果,所以有 2*2 = 4 中情況
如果我們不用橋接模式,那麼實現這麼多情況就需要一個一個的去實現,也就是4類,那麼我們使用橋 接模式呢?答案是:2類。這在條件和實現比較多的情況下優勢會更明顯。
具體的實現:
下面 首先給出實現的UML圖
實現的代碼和說明如下:
1.Fruit類
package com.brucezhang.bridge; public abstract class Fruit { /** * 抽象方法 * @param People * */ public abstract void eatFruit(People people); }
這是一個抽象類,是所有水果的抽象,其中的一個抽象方法是對水果執行的動作,也就是將來我們 需要對水果執行的操作,參數是人。
2.Apple類
package com.brucezhang.bridge; public class Apple extends Fruit{ @Override public void eatFruit(People people) { // TODO Auto-generated method stub System.out.println(people.getType() + " eat apple !"); } }
3.Oranger類
package com.brucezhang.bridge; public class Oranger extends Fruit{ @Override public void eatFruit(People people) { // TODO Auto-generated method stub System.out.println(people.getType() + " eat oranger !"); } }
這兩個類都是水果類的具體實現,都代表的具體的東西,其中需要重載水果類中的抽象方法,且各 自都有各自不同的實現。
4.People類
package com.brucezhang.bridge; public abstract class People { private String type; private Fruit fruit; public String getType() { return type; } public void setType(String type) { this.type = type; } public Fruit getFruit() { return fruit; } public void setFruit(Fruit fruit) { this.fruit = fruit; } //抽象方法 public abstract void eat(); }
這個類是抽象的人,裡面有兩個參數,一個參數是水果,一個參數是類型(代表是男人或是女人)
5.Man類
package com.brucezhang.bridge; public class Man extends People{ public Man(){ setType("Man"); } @Override public void eat() { // TODO Auto-generated method stub getFruit().eatFruit(this); } }
6.Woman類
package com.brucezhang.bridge; public class Woman extends People{ public Woman(){ setType("Woman"); } @Override public void eat() { // TODO Auto-generated method stub getFruit().eatFruit(this); } }
這兩個類繼承自People類,是具體的“人”,其中重寫了父類方法,並在構造函數中說明是“什麼 人”
7.測試類--Main_Test
package com.brucezhang.bridge; public class Main_Test { public static void main(String[] args) { People man = new Man(); People woman = new Woman(); Fruit apple = new Apple(); Fruit oranger = new Oranger(); apple.eatFruit(man); oranger.eatFruit(woman); apple.eatFruit(woman); oranger.eatFruit(man); } }
這裡是對橋接模式的測試。
程序執行的結果如下:
Man eat apple ! Woman eat oranger ! Woman eat apple ! Man eat oranger !