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