做網(wǎng)站需要公司有哪些游戲優(yōu)化大師官網(wǎng)
橋接模式
1、定義
橋接模式:將抽象部分與它的實(shí)現(xiàn)部分解耦,使得兩者都能獨(dú)立變化
2、橋接模式結(jié)構(gòu)
- Abstraction(抽象類):它是用于定義抽象類的,通常是抽象類而不是接口,其中定義了一個(gè)Implementor類型的對(duì)象并可以維護(hù)該對(duì)象,它與Implementor之間具有關(guān)聯(lián)關(guān)系,既可以包含抽象業(yè)務(wù)方法,也可以包含具體業(yè)務(wù)方法
- RefinedAbstraction(擴(kuò)充抽象類):擴(kuò)充Abstraction,通常情況下它不再是抽象類而是具體類,在RefinedAbstraction中可以調(diào)用在Implementor中定義的業(yè)務(wù)方法
- Implementor(實(shí)現(xiàn)類接口):它是定義實(shí)現(xiàn)類的接口,這個(gè)接口不一定要與Abstraction完全一致,事實(shí)上兩個(gè)接口可以完全不同。一般而言,Implementor僅提供基本操作,而Abstraction定義的接口可能會(huì)做更多更復(fù)雜的操作。通過關(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接口
3、示例
Abstraction 創(chuàng)建Person抽象類
public abstract class Person {private Clothing clothing;private String type;public Clothing getClothing() {return clothing;}public void setClothing(Clothing clothing) {this.clothing = clothing;}public void setType(String type) {this.type = type;}public String getType() {return this.type;}public abstract void dress();
}
RefinedAbstraction 創(chuàng)建Man、Lady類
public class Man extends Person{public Man() {setType("男人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}
public class Lady extends Person {public Lady() {setType("女人");}@Overridepublic void dress() {Clothing clothing = getClothing();clothing.personDressCloth(this);}
}
Implementor 創(chuàng)建Clothing抽象類
public abstract class Clothing {public abstract void personDressCloth(Person person);
}
ConcreteImplementor 創(chuàng)建Jacket、Pants類
public class Jacket extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿馬甲");}
}
public class Pants extends Clothing {@Overridepublic void personDressCloth(Person person) {System.out.println(person.getType() + "穿褲子");}
}
測(cè)試類
public class Client {public static void main(String[] args) {Person man = new Man();Person lady = new Lady();Clothing jacket = new Jacket();Clothing pants = new Pants();jacket.personDressCloth(man);pants.personDressCloth(man);jacket.personDressCloth(lady);pants.personDressCloth(lady);}
}
輸出結(jié)果
男人穿馬甲
男人穿褲子
女人穿馬甲
女人穿褲子
4、橋接模式優(yōu)缺點(diǎn)
4.1優(yōu)點(diǎn)
- 分離抽象接口及其實(shí)現(xiàn)部分。使用對(duì)象間的關(guān)聯(lián)關(guān)系解耦了抽象和現(xiàn)實(shí)之間固有的綁定關(guān)系,使抽象和實(shí)現(xiàn)可以沿著各自的維度來變化
- 橋接模式在有些情況下可以取代多層繼承方案,極大減少了子類的個(gè)數(shù)
- 提高了系統(tǒng)的可擴(kuò)展性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度都不需要修改原有系統(tǒng),符合開閉原則
4.2缺點(diǎn)
- 增加系統(tǒng)的理解與設(shè)計(jì)難度,關(guān)聯(lián)關(guān)系建立在抽象層
- 要求正確的識(shí)別出系統(tǒng)中的兩個(gè)獨(dú)立變化的維度,因此其適用范圍具有一定的局限性
5、橋接模式的適用環(huán)境
1.不需要在抽象和它的實(shí)現(xiàn)部分之間有一個(gè)固定的綁定關(guān)系,在程序運(yùn)行時(shí)刻實(shí)現(xiàn)部分程序可以被選擇或者切換。
2.類的抽象以及它的實(shí)現(xiàn)都應(yīng)該可以通過生成子類的方法加以擴(kuò)充。 這時(shí)橋接模式可以對(duì)不同的抽象接口和實(shí)現(xiàn)部分進(jìn)行組合,并分別對(duì)它們進(jìn)行擴(kuò)充。
3.對(duì)一個(gè)抽象的實(shí)現(xiàn)部分的修改應(yīng)對(duì)其他業(yè)務(wù)不產(chǎn)生影響,即其他業(yè)務(wù)的代碼不必重新編譯。
4.需要在多個(gè)對(duì)象間共享實(shí)現(xiàn)(可能使用引用計(jì)數(shù)),但同時(shí)需要對(duì)其他業(yè)務(wù)無感知。