1. 程式人生 > 其它 >WPF開發微信三、高仿微信對話方塊

WPF開發微信三、高仿微信對話方塊

橋接模式

定義:在軟體系統中,某些型別由於自身的邏輯,它具有兩個緯度的變化,那麼如何應對這種多維度的變化呢?就是使他的抽象部分和實現部分分離開,使他們可以獨立變化。

使用場景:需要按兩個維度區分的情況。比如奶茶,按杯型分為大中小,按溫度分為常溫、加冰。那麼如果按照普通介面實現要定義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();
    }
}

返回目錄