Prism框架下的登入視窗跳轉
阿新 • • 發佈:2021-06-23
橋接模式
定義:在軟體系統中,某些型別由於自身的邏輯,它具有兩個緯度的變化,那麼如何應對這種多維度的變化呢?就是使他的抽象部分和實現部分分離開,使他們可以獨立變化。
使用場景:需要按兩個維度區分的情況。比如奶茶,按杯型分為大中小,按溫度分為常溫、加冰。那麼如果按照普通介面實現要定義3*2=6個類才能處理。
橋接模式包含了以下角色:
- 抽象化(Abstraction)角色:定義抽象類,幷包含對實現化物件的引用
- 擴充套件抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現父類中的業務方法,並通過組合關係調用實現化角色中的業務方法。
- 實現化角色(Implementor):定義實現化角色的介面,供擴充套件抽象化角色呼叫。
- 具體實現化角色(Concrete Implementor):給出實現化角色介面的具體實現
例子:我們去咖啡館喝咖啡,一般有4種選擇:大杯加糖,大杯不加糖,小杯加糖,小杯不加糖。按 橋接模式 來說,應該有兩個實現:大小杯,有無糖(味道)。但是兩個 實現 有點冗餘,完全可以把 “大小杯” 這個維度歸併到咖啡本身屬性中,從而這個例子的維度變成:咖啡大小杯,有無糖(味道)。
/** * @description:橋接模式 * @author: mmc * @create: 2019-09-04 21:56 **/ public class Client { interface ICoffeeFlavor { String addWhat(); } // ConcreteImplementor:原味 static class PlainFlavor implements ICoffeeFlavor { @Override public String addWhat() { return "原味"; } } // ConcreteImplementor:加糖 static class SugarFlavor implements ICoffeeFlavor { @Override public String addWhat() { return "加糖"; } } // Abstraction:咖啡 static abstract class Coffee { protected ICoffeeFlavor mFlavor; public Coffee(ICoffeeFlavor flavor) { this.mFlavor = flavor; } public abstract void makeCoffee(); } // RefinedAbstraction:大杯咖啡 static class LargeCoffee extends Coffee { public LargeCoffee(ICoffeeFlavor flavor) { super(flavor); } @Override public void makeCoffee() { System.out.println("大杯咖啡: " + this.mFlavor.addWhat()); } } // RefinedAbstraction:小杯咖啡 static class SmallCoffee extends Coffee { public SmallCoffee(ICoffeeFlavor flavor) { super(flavor); } @Override public void makeCoffee() { System.out.println("小杯咖啡:" + this.mFlavor.addWhat()); } } public static void main(String[] args) { Coffee coffee=new SmallCoffee(new SugarFlavor()); coffee.makeCoffee(); Coffee coffee2=new SmallCoffee(new PlainFlavor()); coffee2.makeCoffee(); } }