6、策略模式

策略模式

1、什麼是策略模式

策略模式做爲一種軟件設計模式,指對象有某個行爲,可是在不一樣的場景中,該行爲有不一樣的實現算法。好比每一個人都要「交我的所得稅」,可是「在美國交我的所得稅」和「在中國交我的所得稅」就有不一樣的算稅方法。java

策略模式(Strategy),定義了一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換。算法

UML結構圖以下:設計模式

png

其中,Context是上下文,維護了一個對Strategy對象的引用;Strategy是策略類,用於定義全部支持算法的公共接口;ConcreteStrategy是具體策略類,封裝了具體的算法或行爲,繼承於Strategy。ide

1. Context上下文

Context上下文角色,也叫Context封裝角色,起承上啓下的做用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。工具

public class Context {
    
    Strategy strategy;
    
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    //上下文接口
    public void contextInterface() {
        strategy.algorithmInterface();
    }

}

2. 策略角色

抽象策略角色,是對策略、算法家族的抽象,一般爲接口,定義每一個策略或算法必須具備的方法和屬性。algorithm是「運算法則」的意思。測試

public abstract class Strategy {
    //算法方法
    public abstract void algorithmInterface();
}

3. 具體策略角色

用於實現抽象策略中的操做,即實現具體的算法,下方用print代替。測試類共3個ConcreteStrategy,其它兩個類與ConcreteStrategyA同理,就再也不贅述了。this

public class ConcreteStrategyA extends Strategy {

    @Override
    public void algorithmInterface() {
        System.out.println("算法A實現");
    }

}

4. Client客戶端

下面依次更換策略,測試一下策略模式。設計

public class Client {
    
    public static void main(String[] args) {
        Context context;
        
        context = new Context(new ConcreteStrategyA());
        context.contextInterface();
        
        context = new Context(new ConcreteStrategyB());
        context.contextInterface();
        
        context = new Context(new ConcreteStrategyC());
        context.contextInterface();
    }
}

/**測試結果
算法A實現
算法B實現
算法C實現
*/

2、策略模式的應用及優缺點

應用場景code

  • 多個類只有算法或行爲上稍有不一樣的場景
  • 算法須要自由切換的場景
  • 須要屏蔽算法規則的場景

優勢:對象

  1. 算法能夠自由切換
  2. 避免使用多重條件判斷(若是不用策略模式咱們可能會使用多重條件語句,不利於維護)
  3. 擴展性良好,增長一個策略只需實現接口便可

缺點:

  1. 策略類數量會增多,每一個策略都是一個類,複用的可能性很小
  2. 全部的策略類都須要對外暴露

3、策略模式案例

咱們來模擬一個下班回家的場景,須要本身選擇不一樣的交通工具來回家

一、上下文類

首先聲明一個TravelContext對象,經過構造方法,傳入具體的交通工具。

public class TravelContext {
    private Vehicle vehicle;

    public TravelContext(Vehicle vehicle){
        this.vehicle = vehicle;
    }

    public void goHome(){
        if (vehicle!=null){
            vehicle.travel();
        }
    }
}

二、交通工具抽象類

public interface Vehicle {
    void travel();
}

三、不一樣的交通工具類

public class Bus implements Vehicle {
    public void travel() {
        System.out.println("乘坐巴士");
    }
}

public class Car implements Vehicle {
    public void travel() {
        System.out.println("乘坐小汽車");
    }
}

public class Taxi implements Vehicle {
    public void travel() {
        System.out.println("乘坐出租車");
    }
}

四、Client客戶端

下面寫一個簡單的程序測試一下上方編寫的代碼。

public class Client {
    public static void main(String[] args) {
        TravelContext travelContext = null;
        System.out.println("請選擇回家乘坐的交通工具:1.小汽車 2.出租車 3.巴士");
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();
        switch (input){
            case 1:
                travelContext = new TravelContext(new Car());
                travelContext.goHome();
                break;
            case 2:
                travelContext = new TravelContext(new Taxi());
                travelContext.goHome();
                break;
            case 3:
                travelContext = new TravelContext(new Bus());
                travelContext.goHome();
                break;
            default:
                System.out.println("請輸入1/2/3");
                break;
        }
    }
}

/**測試結果
請選擇回家乘坐的交通工具:1.小汽車 2.出租車 3.巴士
3
乘坐巴士
*/
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息