1. 程式人生 > >一起學設計模式-策略模式

一起學設計模式-策略模式

一、模式介紹

       策略模式(Strategy Pattern):定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換。

       策略模式讓演算法獨立於使用它的客戶而變化,也稱為政策模式(Policy)。

       策略模式是一種物件行為型模式。

二、模式結構

三、模式程式碼

    1、抽象策略介面

package com.example.demo.strategy;
//策略介面
public interface Strategy {
    public String doScheme(String name,String scheme);
}

    2、具體策略美人計

package com.example.demo.strategy;

//美人計
public class Beauty implements Strategy{
    @Override
    public String doScheme(String name,String scheme) {
        String all = scheme+"    "+"eg:"+name;
        return "美人計:" + all;
    }
}

    3、具體策略苦肉計

package com.example.demo.strategy;

//苦肉計
public class BitterMeat implements Strategy{
    @Override
    public String doScheme(String name,String scheme) {
        String all = scheme+"    "+"eg:"+name;
        return "苦肉計:" + all;
    }
}

    4、具體策略空城計

package com.example.demo.strategy;

//空城計
public class EmptyCity implements Strategy{

    public String doScheme(String name,String scheme) {
        String all = scheme+"    "+"eg:"+name;
        return "空城計:" + all;
    }
}

    5、建立上下文

package com.example.demo.strategy;

//上下文
public class Context {
    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public String executeStrategy(String name,String scheme){
        return strategy.doScheme(name, scheme);
    }
}

    6、 模擬呼叫各策略

package com.example.demo.strategy;

//呼叫策略
public class Main {
    public static void main(String[] args) {
        Context context = new Context(new EmptyCity());
        System.out.println(context.executeStrategy("諸葛亮",
                "虛而示虛的疑兵之計,是一種疑中生疑的心理戰,多用於己弱而敵強的情況。"));

        context = new Context(new BitterMeat());
        System.out.println(context.executeStrategy("三十六計",
                "自己傷害自己,以矇騙他人,從而達到預先設計好的目標。"));


        context = new Context(new Beauty());
        System.out.println(context.executeStrategy("王允,貂蟬之義父",
                "它是利用色情、出賣肉體的方法,以女性勾引男性物件,以男性勾引女性物件,進行間諜情報活動。"));
    }
}

    7、列印結果

四、使用情景

    完成一項任務,往往可以有多種不同的方式,每一種方式稱為一個策略,我們可以根據環境或者條件的不同選擇不同的策略來完成該項任務。

    1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。
    2、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。
    3、登入認證,現在需要登入linux、Windows、mac、認證資料庫。每種認證方式可以封裝一個策略。

五、優缺點

優點: 1、演算法可以自由切換。 2、避免使用多重條件判斷。 3、擴充套件性良好。
缺點: 1、客戶端必須知道所有策略類,並自行決定使用哪一種策略類。2、如果演算法較多,則會造成很多的策略類。

六、demo地址

https://github.com/tongyuxin1/designModel/tree/master/src/main/java/com/example/demo