java桥_JAVA 桥模式
橋梁模式的用意是“將抽象化(Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化”。這句話很短,但是第一次讀到這句話的人很可能都會(huì)思考良久而不解其意。
這句話有三個(gè)關(guān)鍵詞,也就是抽象化、實(shí)現(xiàn)化和脫耦。理解這三個(gè)詞所代表的概念是理解橋梁模式用意的關(guān)鍵。
抽象化
從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征,就是抽象化。例如蘋果、香蕉、生梨、 桃子等,它們共同的特性就是水果。得出水果概念的過(guò)程,就是一個(gè)抽象化的過(guò)程。要抽象,就必須進(jìn)行比較,沒(méi)有比較就無(wú)法找到在本質(zhì)上共同的部分。共同特征是指那些能把一類事物與他類事物區(qū)分開(kāi)來(lái)的特征,這些具有區(qū)分作用的特征又稱本質(zhì)特征。因此抽取事物的共同特征就是抽取事物的本質(zhì)特征,舍棄非本質(zhì)的特征。 所以抽象化的過(guò)程也是一個(gè)裁剪的過(guò)程。在抽象時(shí),同與不同,決定于從什么角度上來(lái)抽象。抽象的角度取決于分析問(wèn)題的目的。
通常情況下,一組對(duì)象如果具有相同的特征,那么它們就可以通過(guò)一個(gè)共同的類來(lái)描述。如果一些類具有相同的特征,往往可以通過(guò)一個(gè)共同的抽象類來(lái)描述。
實(shí)現(xiàn)化
抽象化給出的具體實(shí)現(xiàn),就是實(shí)現(xiàn)化。
一個(gè)類的實(shí)例就是這個(gè)類的實(shí)例化,一個(gè)具體子類是它的抽象超類的實(shí)例化。
脫耦
所謂耦合,就是兩個(gè)實(shí)體的行為的某種強(qiáng)關(guān)聯(lián)。而將它們的強(qiáng)關(guān)聯(lián)去掉,就是耦合的解脫,或稱脫耦。在這里,脫耦是指將抽象化和實(shí)現(xiàn)化之間的耦合解脫開(kāi),或者說(shuō)是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)。
所謂強(qiáng)關(guān)聯(lián),就是在編譯時(shí)期已經(jīng)確定的,無(wú)法在運(yùn)行時(shí)期動(dòng)態(tài)改變的關(guān)聯(lián);所謂弱關(guān)聯(lián),就是可以動(dòng)態(tài)地確定并且可以在運(yùn)行時(shí)期動(dòng)態(tài)地改變的關(guān)聯(lián)。顯然,在Java語(yǔ)言中,繼承關(guān)系是強(qiáng)關(guān)聯(lián),而聚合關(guān)系是弱關(guān)聯(lián)。
將兩個(gè)角色之間的繼承關(guān)系改為聚合關(guān)系,就是將它們之間的強(qiáng)關(guān)聯(lián)改換成為弱關(guān)聯(lián)。因此,橋梁模式中的所謂脫耦,就是指在一個(gè)軟件系統(tǒng)的抽象化和實(shí)現(xiàn)化之間使用聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對(duì)獨(dú)立地變化。這就是橋梁模式的用意。
橋模式的結(jié)構(gòu):
可以看出,這個(gè)系統(tǒng)含有兩個(gè)等級(jí)結(jié)構(gòu):
一、由抽象化角色和修正抽象化角色組成的抽象化等級(jí)結(jié)構(gòu)。
二、由實(shí)現(xiàn)化角色和兩個(gè)具體實(shí)現(xiàn)化角色所組成的實(shí)現(xiàn)化等級(jí)結(jié)構(gòu)。
橋梁模式所涉及的角色有:
● 抽象化(Abstraction)角色:抽象化給出的定義,并保存一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
● 修正抽象化(RefinedAbstraction)角色:擴(kuò)展抽象化角色,改變和修正父類對(duì)抽象化的定義。
● 實(shí)現(xiàn)化(Implementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色的接口,但不給出具體的實(shí)現(xiàn)。必須指出的是,這個(gè)接口不一定和抽象化角色的接口定義相同,實(shí)際上,這兩個(gè)接口可以非常不一樣。實(shí)現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。
● 具體實(shí)現(xiàn)化(ConcreteImplementor)角色:這個(gè)角色給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。
抽象化角色就像是一個(gè)水杯的手柄,而實(shí)現(xiàn)化角色和具體實(shí)現(xiàn)化角色就像是水杯的杯身。手柄控制杯身,這就是此模式別名“柄體”的來(lái)源。
對(duì)象是對(duì)行為的封裝,而行為是由方法實(shí)現(xiàn)的。在這個(gè)示意性系統(tǒng)里,抽象化等級(jí)結(jié)構(gòu)中的類封裝了operation()方法;而實(shí)現(xiàn)化等級(jí)結(jié)構(gòu)中的類封裝的是operationImpl()方法。當(dāng)然,在實(shí)際的系統(tǒng)中往往會(huì)有多于一個(gè)的方法。
抽象化等級(jí)結(jié)構(gòu)中的方法通過(guò)向?qū)?yīng)的實(shí)現(xiàn)化對(duì)象的委派實(shí)現(xiàn)自己的功能,這意味著抽象化角色可以通過(guò)向不同的實(shí)現(xiàn)化對(duì)象委派,來(lái)達(dá)到動(dòng)態(tài)地轉(zhuǎn)換自己的功能的目的。
源代碼:
抽象化角色類,它聲明了一個(gè)方法operation(),并給出了它的實(shí)現(xiàn)。這個(gè)實(shí)現(xiàn)是通過(guò)向?qū)崿F(xiàn)化對(duì)象的委派(調(diào)用operationImpl()方法)實(shí)現(xiàn)的。
public abstract class Abstraction {
protected Implementor impl;
public Abstraction(Implementor impl){
this.impl = impl;
}
//示例方法
public void operation(){
impl.operationImpl();
}
}修正抽象化角色:
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor impl) {
super(impl);
}
//其他的操作方法
public void otherOperation(){
}
}實(shí)現(xiàn)化角色:
public abstract class Implementor {
/**
* 示例方法,實(shí)現(xiàn)抽象部分需要的某些具體功能
*/
public abstract void operationImpl();
}
具體實(shí)現(xiàn)化角色:
public class ConcreteImplementorA extends Implementor {
@Override
public void operationImpl() {
//具體操作
}
}
public class ConcreteImplementorB extends Implementor {
@Override
public void operationImpl() {
//具體操作
}
}
一般而言,實(shí)現(xiàn)化角色中的每個(gè)方法都應(yīng)當(dāng)有一個(gè)抽象化角色中的某一個(gè)方法與之對(duì)應(yīng),但是反過(guò)來(lái)則不一定。換言之,抽象化角色的接口比實(shí)現(xiàn)化角色的接口寬。抽象化角色除了提供與實(shí)現(xiàn)化角色相關(guān)的方法之外,還有可能提供其他的方法;而實(shí)現(xiàn)化角色則往往僅為實(shí)現(xiàn)抽象化角色的相關(guān)行為而存在。
總結(jié)
以上是生活随笔為你收集整理的java桥_JAVA 桥模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2019年11月LPR利率是多少?最新L
- 下一篇: 民生信用卡账单地址变了怎么修改