設計模式(11)-策略模式詳解(易懂)

策略模式的定義

策略模式比較簡單,是指對一系列的算法定義,並將每個算法封裝起來,並且使它們還能夠相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。算法

模型:微信

image

  • Context:上下文角色,起到封裝的做用,持有一個Strategy對象的引用
  • Strategy:策略角色(抽象) 一般爲接口
  • ConcreteStrategy:具體的策略角色

實例說明

策略模式很好理解,這裏拿百度網盤舉例你們應該更明白了。好比如今的百度網盤普通的用戶沒有額外的空間,會員會額外的得到2T空間 ,而超級會員額外得到5T空間+各類福利。這也是一種策略,下面用代碼演示一下:ide

1.Strategy,抽象的策略,也就是獲取的額外的空間this

public interface AbstractStrategy {
    //獲取額外空間的方法
    public  void  getExSpace();
}

2.ConcreteStrategy,也就是普通用戶,會員,超級會員spa

public class OrdinaryUser implements AbstractStrategy{

    @Override
    public void getExSpace() {
        Log.d("qzs","普通用戶沒有額外的空間獲取");
    }
}
public class Vip implements AbstractStrategy {
    @Override
    public void getExSpace() {
        Log.d("qzs","會員用戶有2T額外的空間獲取");
    }
}
public class SuperVip implements AbstractStrategy {
    @Override
    public void getExSpace() {
        Log.d("qzs","超級會員用戶有5T額外的空間獲取");
    }
}

3.Context,上下文,爲了封裝code

public class SpaceContext {
    private  AbstractStrategy abstractStrategy;

    public  SpaceContext(AbstractStrategy abstractStrategy){
        this.abstractStrategy=abstractStrategy;
    }
    //調用抽象策略角色中的方法
    public void getExSpace(){
        this.abstractStrategy.getExSpace();
    }
}

4.調用:對象

SpaceContext spaceContext;
        //若是是普通用戶
        spaceContext=new SpaceContext(new OrdinaryUser());
        spaceContext.getExSpace();
        //若是是會員
        spaceContext=new SpaceContext(new Vip());
        spaceContext.getExSpace();
        //若是是超級會員
        spaceContext=new SpaceContext(new SuperVip());
        spaceContext.getExSpace();

運行結果:接口

image

策略模式的優缺點及其餘

1.優勢ip

  • 策略模式提供了管理相關的算法族的辦法,算法能夠切換
  • 避免使用多重條件轉移語句

2.缺點rem

  • 客戶端知道全部的策略類,並自行決定使用哪個策略類。策略類完成暴露了
  • 策略類有時會很是多

3.適用場景

  • 多個類只區別在表現行爲不一樣,可使用Strategy模式,在運行時動態選擇具體要執行的行爲。
  • 須要在不一樣狀況下使用不一樣的策略(算法),或者策略還可能在將來用其它方式來實現。
  • 對客戶隱藏具體策略(算法)的實現細節,彼此徹底獨立。

強調:策略模式在Android中的應用比較典型是Adapter;另外還有策略枚舉的應用你們感興趣的能夠本身看一下;具體的應用我會另外寫一篇文章來說。

定義和優缺點參考網上信息


另外能夠加入個人Android技術交流羣:458739310
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索