設計模式之禪學習筆記04--策略模式
阿新 • • 發佈:2018-12-21
-----謹以此文表明汪先生學過設計模式
1.策略模式
定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。
類圖:
● Strategy抽象策略
策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性。各
位看官可能要問了,類圖中的AlgorithmInterface是什麼意思,嘿嘿,algorithm是“運演算法則”的意思,結合起來意思就明白了吧。
● Context封裝角色
它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、演算法的直接訪問,
封裝可能存在的變化
● ConcreteStrategy具體策略角色
實現抽象策略中的操作,該類含有具體的演算法。
2.舉個例子
首先來一個策略介面
package com.wx.strategypattern.base;
/*
抽象的策略
*/
public interface Strategy {
public void show();
}
實現策略介面:
package com.wx.strategypattern.imp; import com.wx.strategypattern.base.Strategy; public class ConcreateStrategy1 implements Strategy { @Override public void show() { System.out.println("策略1的方法"); } } package com.wx.strategypattern.imp; import com.wx.strategypattern.base.Strategy; public class ConcreateStrategy2 implements Strategy { @Override public void show() { System.out.println("策略2的方法"); } }
存放策略的地方Context類:
package com.wx.strategypattern.base; /* 它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、 演算法的直接訪問,封裝可能存在的變化 */ public class Context { private Strategy strategy=null; public Context(Strategy strategy) { this.strategy=strategy; } //封裝後的策略方法,再上下文物件中呼叫策略的方法 public void doSomethings() { this.strategy.show(); } }
測試:
package com.wx.strategypattern.test;
import com.wx.strategypattern.base.Context;
import com.wx.strategypattern.base.Strategy;
import com.wx.strategypattern.imp.ConcreateStrategy1;
import com.wx.strategypattern.imp.ConcreateStrategy2;
public class TestStrategy {
public static void main(String[] args)
{
//工廠方法模式返回的是一個具體的產品物件,而這個策略模式返回的是一個Context上下文物件
Strategy concreateStrategy1 = new ConcreateStrategy1();
ConcreateStrategy2 strategy2 = new ConcreateStrategy2();
Context context = new Context(concreateStrategy1);
Context context1 = new Context(strategy2);
context.doSomethings();
context1.doSomethings();
}
}
測試結果:
策略模式的優點:
演算法可以自由切換
避免使用多重條件
擴充套件性良好
策略模式的缺點:
策略類數量增多
所有的策略類都需要對外暴露
策略模式的使用場景:
多個類只有在演算法或行為上稍有不同的場景
演算法需要自由切換的場景
需要遮蔽演算法規則的場景