Bridge Patternapp
模式解讀
bridge 是「橋樑」的意思。就像現實社會裏的橋樑擔負着鏈接兩岸的重大責任同樣,Bridge Pattern也是負責鏈接2個不一樣位置的參與者。ide
橋接模式溝通着「功能的類層次」和「實現的類層次」。將「功能的類層次」和「實現的類層次」分紅2個獨立的類層次可能會弄得支離破碎,因此必須在2個類層次之間建一座溝通的橋樑。ui
程序示例
按照上面的分法,本例能夠分爲4個類按照「功能的類層次」和「實現的類層次」分開,分別爲:this
功能的類層次
Display 該類爲打印內容的類spa
CountDisplay 該類不只能夠打印內容還能夠參數指定打印次數3d
實現的類層次
DisplayImpl 該類爲抽象類,抽象出打印內容所須要的功能code
StringDisplayImpl 該類實現了DisplayImpl 所抽象出來的功能對象
按照如上劃分,製做出了UML圖,以下:blog
功能的類層次: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
));
}
});
}
}
運行結果:
代碼下載:
橋接模式