Android設計模式之外觀模式
阿新 • • 發佈:2019-02-16
橋接模式屬於結構型模式.
主要用於將抽象化與具體實現化解耦,無亂抽象化的擴充套件變化或者實現化的擴充套件變化都不會影響互相影響.將各自的耦合解除.
舉例:
現在有3個人,青年人/中年人/老年人,他們喜歡的食物口味有3種,甜味/麻辣味/清淡味.
常規設計怎麼樣做?
設計3個類ABC分別代表青年人/中年人/老年人,QWE3個類代表甜味/麻辣味/清淡味.
具體的實現有很多種比如
A+Q=青年人喜歡甜的口味
A+W=青年人喜歡麻辣的口味
B+Q=中年人喜歡甜的口味......等等等等
當我們要擴充套件人以及口味的時候必然增加A1B1C1,Q1W1E1等擴充套件類,後續的結果是類的結構膨脹,繼承過程中彼此的耦合增大,讓後續的擴充套件維護更為複雜.
橋接模式則可以將口味作為一個橋介面,抽象化每一個人,具體實現一部分,彼此擴充套件實現並不會增加耦合度.
應用場景
- 一個類或者系統存在兩個維度的獨立變化
- 繼承方式存在多種組合方式的變化,想要通過動態實現擴充套件時可以在抽象層建立聯絡避免使用繼承方式實現
- 抽象化的角色屬於主動方維度(人),橋接繫結的一方屬於被動方(口味)
程式碼示例
(一)橋介面
口味作為一個人的被動方作為橋介面.
- 口味介面
package QiaoJie2;
public interface KouWei {
void kouwei();
}
package QiaoJie2; public class laonian implements KouWei{ @Override public void kouwei() { System.out.print("麻辣味"); } }
package QiaoJie2;
public class QingNian implements KouWei {
@Override
public void kouwei() {
System.out.print("qingnian");
}
}
package QiaoJie2;
public class ZhongNian implements KouWei{
@Override
public void kouwei() {
System.out.print("中年");
}
}
主動橋接:
package QiaoJie2; public abstract class Person { protected KouWei kouWei; /** * 直接匯入物件 * @param kouWei */ public Person (KouWei kouWei){ this.kouWei = kouWei; } /** * 抽象類方法 必須是抽象類 * */ public abstract void personTypeAndFlavor();//人物種類 }
package QiaoJie2;
public class Rrone extends Person{
public Rrone(KouWei kouWei) {
super(kouWei);
// TODO Auto-generated constructor stub
}
@Override
public void personTypeAndFlavor() {
System.out.print("青年人");
kouWei.kouwei();
}
}
package QiaoJie2;
public class RrTwo extends Person{
public RrTwo(KouWei kouWei) {
super(kouWei);
}
@Override
public void personTypeAndFlavor() {
System.out.print("老年");
kouWei.kouwei();
}
}
package QiaoJie;
import QiaoJie2.KouWei;
import QiaoJie2.Person;
import QiaoJie2.QingNian;
import QiaoJie2.RrTwo;
import QiaoJie2.Rrone;
import QiaoJie2.ZhongNian;
import QiaoJie2.laonian;
public class Ren {
public static void main(String[] args) {
// Laonian laonian = new Laonian();
// laonian.food();
//
// Qingnian qingnian = new Qingnian();
// qingnian.food();
//
// zhongnian zhongnian1 = new zhongnian();
// zhongnian1.food();
//
//口味
KouWei laonian = new laonian();
KouWei Qingnian = new QingNian();
KouWei ZhongNian = new ZhongNian();
//qingnianren
Person p1 = new Rrone(Qingnian);
Person p2 = new RrTwo(Qingnian);
Person p3 = new RrTwo(ZhongNian);
p1.personTypeAndFlavor();
System.out.print("\n");
p2.personTypeAndFlavor();
System.out.print("\n");
p3.personTypeAndFlavor();
}
}
總結
橋接模式中具有抽象化與實現化,彼此是獨立的,互不影響,新增擴充套件不影響原有類的改變.
優點
實現透明,具體過程不透明
將抽象與介面互相隔離解耦
提高擴充套件維護性,新的擴充套件維護不影響原有系統
抽象類具有高可複用性
缺點
要求使用者具有抽象思維,抽象獨立出2個維度的類別.