好久沒寫博客了栓辜,最近也不知道在忙些什么,盡管公司項目新需求沒有垛孔,我只是維護升級藕甩,算是比較閑吧,但是感覺好幾把坑周荐,上個哥們留下的坑我得填狭莱;緊急上了個小版本;現(xiàn)在總算有點時間繼續(xù)進行設計模式的研究概作;還有就是最近在看《牧羊少年奇幻之旅》修身養(yǎng)性腋妙;技術方面在看那本數(shù)據(jù)結構與算法經(jīng)典問題解析的書,一個印度人寫的緒論感覺好復雜讯榕;相信深入貫徹估計會長進不兄杷亍匙睹;那么稱這個時間來看看策略模式的概念;
先看下定義:什么是策略模式济竹? 策略模式(Strategy Pattern)是一種比較簡單的模式痕檬,也叫做政策模式(Policy
Pattern);Define a family of algorithms,encapsulate each one,and make them interchangeable.(定義一組
算法送浊,將每個算法都封裝起來梦谜,并且使它們之間可以互換。)袭景,
書中是以諸葛亮三個錦囊妙計保劉備江東娶親 全身而退的例子唁桩;我們現(xiàn)在利用現(xiàn)實生活中的例子來體現(xiàn)策略模式的內(nèi)涵;
今年的雙十一可謂是鬧得歡耸棒,看著琳瑯滿目的商品就連我都忍不住花了3000多購物朵夏,一直想買個人工智能實驗室出品的天貓精靈玩玩;雙十一那天確實有優(yōu)惠榆纽,統(tǒng)一價499,天貓超級會員只需要99捏肢;哎有了這個是不是可以用策略模式來搞一下奈籽;
我們假設,為了回饋廣大新老客戶鸵赫;定義三種策略豪治;
天貓超級會員锯岖,全場400元優(yōu)惠
天貓磚石會員,滿1000元立減200
天貓高級會員 滿1500減 200
巴拉巴拉......
好的業(yè)務場景有了我們用代碼來表現(xiàn)一下:
首先我們定義一個策略抽象接口類:
package com.ldl.istrate;
/**
* @author deling 2017年11月28日
*/
public interface Strategy {
public void operateStrategy(double consumptionAmount);
}
接下來我們定義三個會員類:
package com.ldl.istrate;
public class DiamondMembership implements Strategy {
@Override
public void operateStrategy(double consumptionAmount) {
if(consumptionAmount>=1000) {
System.out.println("我是鉆石會員消費"+(consumptionAmount-200)+"元");
}else {
System.out.println("我是鉆石會員消費"+consumptionAmount+"元");
}
}}
超級會員:
package com.ldl.istrate;
/**
* 超級會員
*
* @author deling 2017年11月28日
*/
public class SuperMembers implements Strategy {
/* (non-Javadoc)
* @see com.ldl.istrate.Strategy#operateStrategy(double)
*/
@Override
public void operateStrategy(double consumptionAmount) {
if(consumptionAmount-400<=0) {
System.out.println("您是超級會員消費"+0+"元");
}else {
System.out.println("您是超級會員消費"+(consumptionAmount-400)+"元");
}
}
}
高級會員:
package com.ldl.istrate;
/**
* @author deling 高級會員 2017年11月28日
*/
public class SeniorMember implements Strategy {
@Override
public void operateStrategy(double consumptionAmount) {
if (consumptionAmount >= 1500) {
System.out.println("您是高級會員消費" + (consumptionAmount - 200) + "元");
} else {
System.out.println("您是高級會員消費" + consumptionAmount + "元");
}
}
}
在弄個執(zhí)行策略的包裝類:
package com.ldl.istrate;
/**
* @author deling 執(zhí)行策略 2017年11月28日
*/
public class Context {
private Strategy strategy;
/**
* 執(zhí)行策略
*/
public void executionStrategy(double consumptionAmount) {
this.strategy.operateStrategy(consumptionAmount);
}
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
}
執(zhí)行一下:
package com.ldl.istrate;
/**
* @author deling
*2017年11月28日
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Strategy strategy=new DiamondMembership();
Context context=new Context(strategy);
context.executionStrategy(800);
strategy= new SuperMembers();
context=new Context(strategy);
context.executionStrategy(300);
strategy=new SeniorMember();
context=new Context(strategy);
context.executionStrategy(300);
}
}
看到了效果有了,這就是用了策略模式灭衷;
我們先總結一下;等會畫個類圖更清晰:
缺點: 1.策略類數(shù)量增多,每一個策略都是一個類冈闭,復用的可能性很小稼稿,類數(shù)量增多
- 所有的策略類都需要對外暴露;我們可以使用其他模式來修正這個缺陷,
如工廠方法模式者吁、代理模式或享元模式
優(yōu)點:
- 避免使用多重條件判斷
2.算法可以自由切換
策略模式的使用場景:
1.多個類只有在算法或行為上稍有不同的場景窘俺。
2.算法需要自由切換的場景。