第1章 策略模式【StrategyPattern】
劉備要到江東娶老婆了,走之前諸葛亮給趙云(伴郎)三個(gè)錦囊妙計(jì),說是按天機(jī)拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最后是周瑜陪了夫人又折兵呀,那咱們先看看這個(gè)場(chǎng)景是什么樣子的。
先說這個(gè)場(chǎng)景中的要素:三個(gè)妙計(jì),一個(gè)錦囊,一個(gè)趙云,妙計(jì)是小亮同志給的,妙計(jì)是放置在錦囊里,俗稱就是錦囊妙計(jì)嘛,那趙云就是一個(gè)干活的人,從錦囊中取出妙計(jì),執(zhí)行,然后獲勝,用 JAVA 程序怎么表現(xiàn)這個(gè)呢?我們先看類圖:
三個(gè)妙計(jì)是同一類型的東東,那咱就寫個(gè)接口:package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 首先定一個(gè)策略接口,這是諸葛亮老人家給趙云的三個(gè)錦囊妙計(jì)的接口*
*/
public interface IStrategy {//每個(gè)錦囊妙計(jì)都是一個(gè)可執(zhí)行的算法
public void operate();}
第4頁(yè)
然后再寫三個(gè)實(shí)現(xiàn)類,有三個(gè)妙計(jì)嘛:package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 找喬國(guó)老幫忙,使孫權(quán)不能殺劉備
*/
public class BackDoor implements IStrategy {
public void operate() {System.out.println("找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力");
}}
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 求吳國(guó)太開個(gè)綠燈
*/
public class GivenGreenLight implements IStrategy {
public void operate() {System.out.println("求吳國(guó)太開個(gè)綠燈,放行!");
}}
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 孫夫人斷后,擋住追兵
*/
public class BlockEnemy implements IStrategy {public void operate() {
您的設(shè)計(jì)模式
第5頁(yè)
您的設(shè)計(jì)模式
System.out.println("孫夫人斷后,擋住追兵");}
}
好了,大家看看,三個(gè)妙計(jì)是有了,那需要有個(gè)地方放這些妙計(jì)呀,放錦囊呀:package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.* 計(jì)謀有了,那還要有錦囊
*/
public class Context {//構(gòu)造函數(shù),你要使用那個(gè)妙計(jì)
private IStrategy straegy;
public Context(IStrategy strategy){
this.straegy = strategy;}
//使用計(jì)謀了,看我出招了public void operate(){
this.straegy.operate();}
}
然后就是趙云雄赳赳的揣著三個(gè)錦囊,拉著已步入老年行列的、還想著娶純情少女的、色迷迷的劉老爺子去入贅了,嗨,還別說,小亮的三個(gè)妙計(jì)還真是不錯(cuò),瞅瞅:
package com.cbf4life.strategy;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.*/
public class ZhaoYun {/**
* 趙云出場(chǎng)了,他根據(jù)諸葛亮給他的交代,依次拆開妙計(jì)
*/
public static void main(String[] args) {Context context;
第6頁(yè)
您的設(shè)計(jì)模式
//剛剛到吳國(guó)的時(shí)候拆第一個(gè)System.out.println("-----------剛剛到吳國(guó)的時(shí)候拆第一個(gè)-------------");context = new Context(new BackDoor()); //拿到妙計(jì)
context.operate(); //拆開執(zhí)行System.out.println("\n\n\n\n\n\n\n\n");
//劉備樂不思蜀了,拆第二個(gè)了System.out.println("-----------劉備樂不思蜀了,拆第二個(gè)了-------------");context = new Context(new GivenGreenLight());
context.operate(); //執(zhí)行了第二個(gè)錦囊了System.out.println("\n\n\n\n\n\n\n\n");
//孫權(quán)的小兵追了,咋辦?拆第三個(gè)
System.out.println("-----------孫權(quán)的小兵追了,咋辦?拆第三個(gè)-------------");
context = new Context(new BlockEnemy());context.operate(); //孫夫人退兵System.out.println("\n\n\n\n\n\n\n\n");
/**問題來了:趙云實(shí)際不知道是那個(gè)策略呀,他只知道拆第一個(gè)錦囊,
*而不知道是BackDoor這個(gè)妙計(jì),咋辦? 似乎這個(gè)策略模式已經(jīng)把計(jì)謀名稱寫出來了*
* 錯(cuò)!BackDoor、GivenGreenLight、BlockEnemy只是一個(gè)代碼,你寫成first、second、third,沒人會(huì)說你錯(cuò)!
*
* 策略模式的好處就是:體現(xiàn)了高內(nèi)聚低耦合的特性呀,缺點(diǎn)嘛,這個(gè)那個(gè),我回去再查查
*/
}}
就這三招,搞的周郎是“陪了夫人又折兵”呀!這就是策略模式,高內(nèi)聚低耦合的特點(diǎn)也表現(xiàn)出來了,還有一個(gè)就是擴(kuò)展性,也就是 OCP 原則,策略類可以繼續(xù)增加下去,只要修改 Context.java 就可以了,這個(gè)不多說了,自己領(lǐng)會(huì)吧。
總結(jié)
以上是生活随笔為你收集整理的第1章 策略模式【StrategyPattern】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么在iOS上访问优酷和土豆一样可以播
- 下一篇: HTTP head 详解