|
1,什么是策略模式?
策略模式,又叫算法簇模式,就是定義了不同的算法族,并且之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
2,策略模式有什么好處?
策略模式的好處在于你可以動態(tài)的改變對象的行為。
3,設(shè)計原則
設(shè)計原則是把一個類中經(jīng)常改變或者將來可能改變的部分提取出來,作為一個接口(c++z中可以用虛類),然后在類中包含這個對象的實例,這樣類的實例在運行時就可以隨意調(diào)用實現(xiàn)了這個接口的類的行為。下面是一個例子。
策略模式屬于對象行為型模式,主要針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響
到客戶端的情況下發(fā)生變化。通常,策略模式適用于當一個應用程序需要實現(xiàn)一種特定的服務(wù)或者功能,而且該程序有多種實現(xiàn)方式時使用。
4 ,策略模式中有三個對象:
(1) 環(huán)境對象:該類中實現(xiàn)了對抽象策略中定義的接口或者抽象類的引用。
(2) 抽象策略對象:它可由接口或抽象類來實現(xiàn)。
(3) 具體策略對象:它封裝了實現(xiàn)同不功能的不同算法。
利用策略模式構(gòu)建應用程序,可以根據(jù)用戶配置等內(nèi)容,選擇不同有算法來實現(xiàn)應用程序的功能。具體的選擇有環(huán)境對象來完成。采用這種方式可以避免由于使用條件語句而帶來的代碼混亂,提高應用程序的靈活性與條理性。
5,應用場景舉例:
劉備要到江東娶老婆了,走之前諸葛亮給趙云(伴郎)三個錦囊妙計,說是按天機拆開能解決棘手問題,嘿,還別說,真解決了大問題,搞到最后是周瑜陪了夫人又折兵,那咱們先看看這個場景是什么樣子的。
先說說這個場景中的要素:三個妙計,一個錦囊,一個趙云,妙計是亮哥給的,妙計放在錦囊里,俗稱就是錦囊妙計嘛,那趙云就是一個干活的人,從錦囊取出妙計,執(zhí)行,然后獲勝。用java程序怎么表現(xiàn)這些呢?
那我們先來看看圖?

三個妙計是同一類型的東西,那咱就寫個接口:
- package com.yangguangfu.strategy;
-
-
-
-
-
- public interface IStrategy {
-
- public void operate();
-
- }
然后再寫三個實現(xiàn)類,有三個妙計嘛:
妙計一:初到吳國:
- package com.yangguangfu.strategy;
-
-
-
-
-
- public class BackDoor implements IStrategy {
-
- @Override
- public void operate() {
- System.out.println("找喬國老幫忙,讓吳國太給孫權(quán)施加壓力,使孫權(quán)不能殺劉備...");
- }
-
- }
妙計二:求吳國太開個綠燈,放行:
- package com.yangguangfu.strategy;
-
-
-
-
-
- public class GivenGreenLight implements IStrategy {
-
- @Override
- public void operate() {
- System.out.println("求吳國太開個綠燈,放行!");
-
- }
-
- }
妙計三:孫夫人斷后,擋住追兵:
- package com.yangguangfu.strategy;
-
-
-
-
-
- public class BlackEnemy implements IStrategy {
-
- @Override
- public void operate() {
- System.out.println("孫夫人斷后,擋住追兵...");
-
- }
-
- }
好了,大家看看,三個妙計是有了,那需要有個地方放妙計啊,放錦囊里:
- package com.yangguangfu.strategy;
-
-
-
-
-
- public class Context {
-
- private IStrategy strategy;
-
- public Context(IStrategy strategy){
- this.strategy = strategy;
- }
-
- public void operate(){
- this.strategy.operate();
- }
-
- }
然后就是趙云雄赳赳的揣著三個錦囊,拉著已步入老年行列,還想著娶純情少女的,色咪咪的劉備老爺子去入贅了,嗨,還別說,亮哥的三個妙計還真不錯,瞧瞧:
- package com.yangguangfu.strategy;
-
- public class ZhaoYun {
-
-
-
-
- public static void main(String[] args) {
- Context context;
-
-
- System.out.println("----------剛剛到吳國的時候拆開第一個---------------");
- context = new Context(new BackDoor());
- context.operate();
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
-
-
- System.out.println("----------劉備樂不思蜀,拆第二個了---------------");
- context = new Context(new GivenGreenLight());
- context.operate();
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
-
-
- System.out.println("----------孫權(quán)的小追兵了,咋辦?拆開第三個錦囊---------------");
- context = new Context(new BlackEnemy());
- context.operate();
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- }
-
- }
后話:就這三招,搞得的周郎是“賠了夫人又折兵”呀!這就是策略模式,高內(nèi)聚低耦合的特點也表現(xiàn)出來了,還有一個就是擴展性,也就是OCP原則,策略類可以繼續(xù)添加下去氣,只是修改Context.java就可以了,這個不多說了,自己領(lǐng)會吧。
|