設計模式-行爲型- 策略模式(Strategy)

定義

策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化

角色

策略接口(Strategy):爲一系列策略算法提供一個統一接口

具體策略:實現策略接口,並實現其中的算法

上下文:負責策略的切換,內含Strategy引用

優點

  • 提供了管理某一類算法的辦法
  • 提供了可以替換繼承關係的辦法,同時又保留了繼承代碼重用的優點
  • 讓系統更加靈活、易擴展

缺點

  • 每個算法都有一個策略類,策略類太多
  • 用戶必須知道有哪些策略類,而且要知道不同策略類算法的不同

適用場景

  • 許多相似的類,他們只是算法(策略)不同
  • 具體算法實現不想讓用戶看到時
  • 在需要實現不同策略的時候

類圖

Strategy

package com.vapy.behavior.Strategy;
/**
 * 
 * @author vapy
 *
 */
public interface Strategy {
    public int calc(int a, int b);
}
package com.vapy.behavior.Strategy;
/**
 * 
 * @author vapy
 *
 */
public class Add implements Strategy {
    @Override
    public int calc(int a, int b) {
        return a + b;
    }
}
package com.vapy.behavior.Strategy;
/**
 * 
 * @author vapy
 *
 */
public class Sub implements Strategy {
    @Override
    public int calc(int a, int b) {
        return a - b;
    }
}
package com.vapy.behavior.Strategy;
/**
 * 
 * @author vapy
 *
 */
public class Context {
    private Strategy strategy;

    public Context(){}

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

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calc(int a, int b) {
        return this.strategy.calc(a, b);
    }
}
package com.vapy.behavior.Strategy;
/**
 * 
 * @author vapy
 *
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context(new Add());
        System.out.println(context.calc(3, 5));
        context.setStrategy(new Sub());
        System.out.println(context.calc(3, 5));
    }
}

StrategyResult
本文代碼可在github查看:點擊此處

發佈了55 篇原創文章 · 獲贊 29 · 訪問量 123萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章