Bridge Pattern
模式解讀
bridge 是“橋梁”的意思。就像現實社會裡的橋梁擔負著連接兩岸的重大責任一樣,Bridge Pattern也是負責連接2個不同位置的參與者。
橋接模式溝通著“功能的類層次”和“實現的類層次”。將“功能的類層次”和“實現的類層次”分成2個獨立的類層次可能會弄得支離破碎,所以必須在2個類層次之間建一座溝通的橋梁。
程序示例
按照上面的分法,本例可以分為4個類按照“功能的類層次”和“實現的類層次”分開,分別為:
功能的類層次
Display 該類為打印內容的類
CountDisplay 該類不僅可以打印內容還可以參數指定打印次數
實現的類層次
DisplayImpl 該類為抽象類,抽象出打印內容所需要的功能
StringDisplayImpl 該類實現了DisplayImpl 所抽象出來的功能
按照如上劃分,制作出了UML圖,如下:
功能的類層次:Display 類,代碼:
public class Display {
private DisplayImpl impl;
public Display(DisplayImpl impl) {
this.impl = impl;
}
public String open() {
return impl.rawOpen();
}
public String print() {
return impl.rawPrint();
}
public String close() {
return impl.rawClose();
}
public final String display() {
open();
String text = print();
close();
return text;
}
}
該類通過參數將DisplayImpl傳進來,直接讓Display 有DisplayImpl的功能。該功能也是Builder Pattern 的模式。位於“功能的類層次”最上層的類,利用接口參與者的方法只記載基本功能的類。這個對象實例是保持住接口參與者。該類為扮演這個參與者的類。
功能的類層次:CountDisplay類 ,代碼:
public class CountDisplay extends Display {
public CountDisplay(DisplayImpl impl) {
super(impl);
// TODO Auto-generated constructor stub
}
public String multiDisplay(int times) {
StringBuffer sb = new StringBuffer();
sb.append(open()+"\n");
for (int i = 0; i < times; i++) {
sb.append(print()+"\n");
}
return sb.append(close()).toString();
}
}
該類系Display 的子類,並且再添加一個可按照次數循環打印的方法。對抽象參與者新增功能的參與者(改良後的抽象化),該類扮演在這個DEMO中扮演著這個角色。
實現的類層次:DisplayImpl 類,代碼:
public abstract class DisplayImpl {
public abstract String rawOpen();
public abstract String rawPrint();
public abstract String rawClose();
}
該類位於實現的類層次的最上層,分別抽象了rawOpen、rawPrint、rawClose三個方法,這三個方法分別對應到Display 類的open、print、close方法,執行前處理、打印和後處理。規定要實現的抽象參與者的接口 。
實現的類層次:StringDisplayImpl 類,代碼:
public class StringDisplayImpl extends DisplayImpl{
private String string;
public StringDisplayImpl(String str){
this.string=str;
}
@Override
public String rawClose() {
// TODO Auto-generated method stub
return printLine();
}
@Override
public String rawOpen() {
// TODO Auto-generated method stub
return printLine();
}
@Override
public String rawPrint() {
// TODO Auto-generated method stub
return "|"+string+"|";
}
private String printLine(){
StringBuffer sb=new StringBuffer();
sb.append("+");
for(int i=0;i<string.length();i++){
sb.append("-");
}
return sb.append("+").toString();
}
}
該類實現了DisplayImpl的三個抽象方法,本例中唯一一處實現功能的也是由本類完成。具體實現接口 參與者的接口 。
界面入口:BridgePatternActivity 類,代碼:
public class BridgePatternActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
((Button)findViewById(R.id.Button01)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Display display=new Display(new StringDisplayImpl("terry_龍"));
CountDisplay mCountDisplay=new CountDisplay(new StringDisplayImpl("terry"));
((EditText)findViewById(R.id.EditText01)).setText(display.print());
((EditText)findViewById(R.id.EditText02)).setText(mCountDisplay.multiDisplay(5));
}
});
}
}
運行結果:
代碼下載:
橋接模式