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