1. 程式人生 > 實用技巧 >關於深拷貝和淺拷貝

關於深拷貝和淺拷貝

橋接模式

一、簡介

橋接模式承擔著連線“兩邊”的作用,此處的兩邊指的是抽象部分和實現部分。

定義:將抽象部分與實現部分分離是的它們都能獨立的進行變化。

二、使用場景

  • 任何多維度變化類或者多個梳妝類之間的耦合都可以使用橋接模式來實現解耦
  • 如果一個系統需要在構建的抽象化角色和具體角色之間增加更多的靈活性避免在兩個層次之間建立靜態的繼承關係,可以通過橋接模式使他們在抽象層建立一個關聯關係
  • 對於不希望使用繼承關係或因為多層次繼承關係導致系統類的個數急劇增加的系統可以使用橋接模式
  • 一個類需要兩個獨立變化的維度且這兩個維度都需要進行擴充套件

三、簡單實現

這裡以喝咖啡為例簡單實現橋接模式,當我們下單咖啡時會選擇大杯還是小杯、加糖還是不加糖等所以對一杯咖啡來說有兩種變化一是大杯小杯 二是加糖還是不加糖。

//抽象咖啡類
public abstract class Coffee{
    protected CoffeeAdditives coffeeAdditives;

    public Coffee(CoffeeAdditives coffeeAdditives) {
        this.coffeeAdditives = coffeeAdditives;
    }
    public abstract void makeCoffee();
}

public class LargeCoffee extends Coffee{

    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        Log.i(TAG, "makeCoffee: large "+coffeeAdditives.addSomething()+" coffee");
    }
}

public class SmallCoffee extends Coffee{

    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    public void makeCoffee() {
        Log.i(TAG, "makeCoffee: small "+coffeeAdditives.addSomething()+" coffee");
    }
}

public abstract class CoffeeAdditives {

    public abstract String addSomething();
}

public class Suger extends CoffeeAdditives{

    @Override
    public String addSomething() {
        return "sugre";
    }
}

public class Ordinary extends CoffeeAdditives{

    @Override
    public String addSomething() {
        return "";
    }
}

public void Test(){
    Ordinary ordinary=new Ordinary();
    Suger suger=new Suger();
    
    LargeCoffee largeCoffee=new LargeCoffee(ordinary);
    LargeCoffee largeCoffee1=new LargeCoffee(suger);
    
    SmallCoffee smallCoffee=new SmallCoffee(ordinary);
    SmallCoffee smallCoffee1=new SmallCoffee(suger);
    
    
}

可以看到我們對咖啡變化的兩個維度定義了兩個對應的抽象類,然後跟據情況分別實現了這兩個抽象類的實現類,這樣這兩個維度就可以自由獨立變化兩者之間的唯一聯絡就是Coffee中保持對CoffeeAdditives的引用。當我們增加中杯咖啡時就非常的方便只需實現中杯咖啡類即可

    public class MiddleCoffee extends Coffee{

        public MiddleCoffee(CoffeeAdditives coffeeAdditives) {
            super(coffeeAdditives);
        }

        @Override
        public void makeCoffee() {
            Log.i(TAG, "makeCoffee: middle "+coffeeAdditives.addSomething()+" coffee");
        }
    }
        
        //建立不同的MiddleCoffee
        MiddleCoffee middleCoffee=new MiddleCoffee(ordinary);
        MiddleCoffee middleCoffee1=new MiddleCoffee(suger);

四、小結

在Android中橋接模式使用的非常廣泛,比如Adapter和AdapterView以及Window和WindowManager。橋接模式對於抽象與實現的分離的把握是不容易控制的,這對開發者來說需要一定的經驗要求。但是橋接模式具有分離抽象與實現、靈活的擴充套件以及對客戶來說透明的實現等優點。