策略模式作為一種軟體設計模式,指物件有某個行為,但是在不同的場景中,該行為有不同的實現演算法。比如每個人都要「交個人所得稅」,但是「在美國交個人所得稅」和「在中國交個人所得稅」就有不同的算稅方法。
策略模式的結構組成:
—抽象策略角色: 策略類,通常由乙個介面或者抽象類實現。
—環境角色:持有乙個策略類的引用,最終給客戶端呼叫
原理我相信大家都知道,應該如何應用呢?怎樣融合到專案開發中?
使用策略模式可以很容易實現可插拔系統的設計。
策略模式實踐場景(1): 普通應用場景,基於普通jar包裡面的應用
1.定義抽象策略角色targetinte***ce,具體策略角色:教師teacherimpl和學生studentimpl,環境角色policymanager
/**
* 抽象策略角色
* * @author: fengyantao
* @date: 2019/11/14 上午11:31
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:31
*/public inte***ce targetinte***ce
/** * 具體策略角色: 學生
* * @author: fengyantao
* @date: 2019/11/14 上午11:32
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:32
*/public class studentimpl implements targetinte***ce
}/**
* 具體策略角色:教師
* * @author: fengyantao
* @date: 2019/11/14 上午11:33
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:33
*/public class teacherimpl implements targetinte***ce
}/**
* 環境角色
* * @author: fengyantao
* @date: 2019/11/14 上午11:39
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:39
*/public class policymanager
public string read()
}
2.編寫測試類
/**
* 普通應用場景
*/public static void commontest()
結果輸出:
*************************=學生
*************************=教師
策略模式實踐場景(2):基於框架的使用,比如某個介面有很多實現(100個),在某個service中需要呼叫10個不同的實現類,那麼就需要注入10個實現類,就會看到好多@resource(name = "serimpl")的註解。那麼**看起來就很費勁了。
筆者基於上面的類做些改變,融合到框架中。
1.每個具體策略角色新增@service註解,把物件交給spring框架管理,建立spring框架管理者springcontextmanager,動態獲取bean例項
/**
* 抽象策略角色
* * @author: fengyantao
* @date: 2019/11/14 上午11:31
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:31
*/public inte***ce targetinte***ce
/** * 具體策略角色: 學生
* * @author: fengyantao
* @date: 2019/11/14 上午11:32
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:32
*/@service
public class studentimpl implements targetinte***ce
}/**
* 具體策略角色:教師
* * @author: fengyantao
* @date: 2019/11/14 上午11:33
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:33
*/@service
public class teacherimpl implements targetinte***ce
}/**
* 環境角色
* * @author: fengyantao
* @date: 2019/11/14 上午11:39
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:39
*/public class policymanager
public string read()
}/**
* spring框架管理
* * @author: fengyantao
* @date: 2019/11/14 上午11:39
* @version: v1.0
* @review: fengyantao/2019/11/14 上午11:39
*/@configuration
@suppresswarnings("all")}}
/*** 根據類從spring上下文獲取bean。
** @param clazz
* @param * @return
*/public static t getbean(classclazz)
/*** 根據類名從spring上下文獲取bean。
** @param beanid
* @param * @return
*/public static t getbean(string beanid)
}
2.編寫測試類
/**
* 框架應用場景
*/targetinte***ce studentimpl = springcontextmanager.getbean("studentimpl");
policymanager policymanager = new policymanager(studentimpl);
targetinte***ce teacherimpl = springcontextmanager.getbean("teacherimpl");
policymanager policymanager1 = new policymanager(teacherimpl);
system.out.println("*************************=" + policymanager.read());
system.out.println("*************************=" + policymanager1.read());
}
結果輸出:
*************************=學生
*************************=教師
1 設計模式之策略模式
設計模式的一句話 過分設計是一種罪過,要根據專案實事求是,沒有任何一種設計是一步到位,很多功能都是根據反饋進行改善。1 背景 在實際開發中,我們常常遇見實現某種業務功能時,有許多不同實現方式,使用者可以任意選擇其中的一種方式。例如,在排序某個序列資料時,我們可以選擇氣泡排序 快速排序 插入排序 堆排...
設計模式 二 策略模式 1
策略模式 strategy 它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。結構圖 strategy抽象類,定義所有支援的演算法的公共介面。class strategy 演算法方法 virtual void algorithminte ce...
設計模式 一 策略模式 1
策略模式用到就是 多型 的思想,父類有多個子類,為同乙個行為實現不同的表現形式 舉例 1個中國人,1個印度人,他們都吃飯,但是中國人是用筷子,印度人是用手,這個就是多型,同一行為的2種實現方式 吃飯行為 public inte ce eating中國人和印度人 public class chines...