非物質(zhì)文化遺產(chǎn)網(wǎng)站怎么做seo推廣是什么工作
橋接模式
橋接模式的本質(zhì),是解決一個(gè)基類(lèi),存在多個(gè)擴(kuò)展維度的的問(wèn)題。
比如一個(gè)圖形基類(lèi),從顏色方面擴(kuò)展和從形狀上擴(kuò)展,我們都需要這兩個(gè)維度進(jìn)行擴(kuò)展,這就意味著,我們需要?jiǎng)?chuàng)建一個(gè)圖形子類(lèi)的同時(shí),還要以這個(gè)顏色維度進(jìn)行區(qū)分,假如有兩個(gè)顏色,那么創(chuàng)建一個(gè)圖形基類(lèi),就需要構(gòu)建兩個(gè)不同顏色的子類(lèi),這樣代碼非常的冗余且不好維護(hù),隨著擴(kuò)展的增多,子類(lèi)會(huì)越來(lái)越多。
?這時(shí)候橋接模式就派上用場(chǎng)了,我們只保留一個(gè)維度的擴(kuò)展作為主維度,并保存著另一個(gè)維度的引用,這個(gè)引用就像一條橋梁一樣,因此稱(chēng)之為橋接模式,另一個(gè)維度的抽象可以隨意擴(kuò)展,不會(huì)造成主維度的代碼有任何的冗余和影響。
?
適用環(huán)境
一個(gè)類(lèi)存在兩個(gè)(或多個(gè))獨(dú)立變化的維度,且這兩個(gè)(多個(gè))維度都需要進(jìn)行擴(kuò)展。
如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過(guò)橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
對(duì)于那些不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用。
?uml圖
?
其中包含如下角色:
Abstraction(抽象類(lèi)):用于定義抽象類(lèi)的接口,它一般是抽象類(lèi)而不是接口,其中定義了一個(gè) Implementor(實(shí)現(xiàn)類(lèi)接口)類(lèi)型的對(duì)象并可以維護(hù)該對(duì)象,它與 Implementor 之間具有關(guān)聯(lián)關(guān)系。
RefinedAbstraction(提煉抽象類(lèi)):可以理解為,擴(kuò)展的主維度,擴(kuò)充由 Abstraction 定義的接口,通常情況下它不再是抽象類(lèi)而是具體類(lèi),它實(shí)現(xiàn)了在 Abstraction 中聲明的抽象業(yè)務(wù)方法,在 RefinedAbstraction 中可以調(diào)用在 Implementor 中定義的業(yè)務(wù)方法。
Implementor(實(shí)現(xiàn)類(lèi)接口):定義實(shí)現(xiàn)類(lèi)的接口,這個(gè)接口不一定要與 Abstraction 的接口完全一致,事實(shí)上這兩個(gè)接口可以完全不同,一般而言,Implementor 接口僅提供基本操作,而 Abstraction 定義的接口可能會(huì)做更多更復(fù)雜的操作。Implementor 接口對(duì)這些基本操作進(jìn)行了聲明,而具體實(shí)現(xiàn)交給其子類(lèi)。通過(guò)關(guān)聯(lián)關(guān)系,在 Abstraction 中不僅擁有自己的方法,還可以調(diào)用到 Implementor 中定義的方法,使用關(guān)聯(lián)關(guān)系來(lái)替代繼承關(guān)系。
ConcreteImplementor(具體實(shí)現(xiàn)類(lèi)):具體實(shí)現(xiàn) Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同實(shí)現(xiàn),在程序運(yùn)行時(shí),ConcreteImplementor 對(duì)象將替換其父類(lèi)對(duì)象,提供給抽象類(lèi)具體的業(yè)務(wù)操作方法。
?
?
實(shí)例
我們就以上述形狀與顏色這兩個(gè)獨(dú)立的維度來(lái)實(shí)現(xiàn)給不同的形狀刷上不同顏色的例子來(lái)講解:
ColorAPI :用于畫(huà)各種顏色的接口
我們就以上述形狀與顏色這兩個(gè)獨(dú)立的維度來(lái)實(shí)現(xiàn)給不同的形狀刷上不同顏色的例子來(lái)講解:
實(shí)現(xiàn)化角色
ColorAPI :用于畫(huà)各種顏色的接口
public interface ColorApi {//抽象的上色方法void paint();
}
具體實(shí)現(xiàn)化角色
ColorApiBlue:畫(huà)上藍(lán)色的實(shí)現(xiàn)類(lèi)
public class ColorApiBlue implements ColorApi{@Overridepublic void paint() {System.out.println("畫(huà)上藍(lán)色...");}
}
ColorApiRed:畫(huà)上紅色的實(shí)現(xiàn)類(lèi)
public class ColorApiRed implements ColorApi{@Overridepublic void paint() {System.out.println("畫(huà)上紅色...");}
}
抽象化角色
下面來(lái)規(guī)劃基礎(chǔ)圖形抽象類(lèi)Shape
public abstract class Shape {//保存對(duì)顏色維度實(shí)現(xiàn)化角色的應(yīng)用protected ColorApi colorApi;//進(jìn)行顏色渲染操作,這里只進(jìn)行一個(gè)規(guī)范public abstract void paint();//注入顏色實(shí)現(xiàn)化角色public void setColorApi(ColorApi colorApi) {this.colorApi = colorApi;}
}
-
修正抽象化角色
往形狀方面擴(kuò)展的子類(lèi)
Circle
public class Circle extends Shape{@Overridepublic void paint() {System.out.println("我是圓形");super.colorApi.paint();}
}
Square
public class Square extends Shape{@Overridepublic void paint() {//開(kāi)始進(jìn)行修正擴(kuò)展//調(diào)用保存的顏色維度實(shí)現(xiàn)化角色的染色方法super.colorApi.paint();}
}
客戶(hù)端代碼
public class Client {public static void main(String[] args) {//創(chuàng)建圓形Shape circle=new Circle();//創(chuàng)建紅色顏料的實(shí)現(xiàn)化角色ColorApi red=new ColorApiRed();//將顏料交給圓形circle.setColorApi(red);//上色circle.paint();}}
輸出?
?現(xiàn)在再來(lái)看“將抽象部分與他的實(shí)現(xiàn)部分分離”這句話(huà),實(shí)際上就是在說(shuō)實(shí)現(xiàn)系統(tǒng)可能有多個(gè)角度分類(lèi)(例如例子中的形狀與顏色),每一種分類(lèi)都有可能變化,那么把這種多角度分離出來(lái)讓他們獨(dú)立變化,減少他們之間的耦合。