Java設計模式----策略模式

策略模式(Strategy Pattern)體現了兩個非常基本的面向對象設計的原則

      1、封裝變化的概念;

      2、編程中使用接口,而不是對接口的實現。

  策略模式定義了一個共同的抽象算法接口,其子類實現這個接口定義的方法,並且都有各自不同的實現,這些算法實現可以在客戶端調用它們的時候互不影響的變化。   子算法之間是弱連接的關係,提高了軟件的可擴展性與可重用性。

 策略模式組成

   1、抽象策略角色:策略類,通常由一個接口或者抽象類實現

   2、具體策略角色:包括了相關的算法和行爲,可能不止一個具體策略角色

   3、環境角色:持有一個策略類的引用,最終給客戶端調用的。

策略模式編寫步驟

  1、對一組算法抽象出一個共同接口,定義這個共同接口

  2、編寫策略類,實現這個藉口,每個策略類都有其獨特的實現

  3、編寫環境角色類,類中持有一個對共同接口的引用,對策略對象注入如set方法和get方法或者用構造方法完成賦值


下面是一個策略模式事例

        劉備要到江東娶老婆了,走之前諸葛亮給趙雲(伴郎)三個錦囊妙計,說是按天機拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最後是周瑜陪了夫人又折兵呀,那咱們先看看這個場景是什麼樣子的。
        先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲,妙計是小亮同志給的,妙計是放置在錦囊裏,俗稱就是錦囊妙計嘛,那趙雲就是一個幹活的人,從錦囊中取出妙計,執行,然後獲勝,用 JAVA 程序怎麼表現這個呢?我們先看類圖:


三個妙計是同一類型的東東,那咱就寫個接口:

package com.sanguo.strategy;

/**
 * 定義策略接口
 * 諸葛亮妙計接口
 * */
public interface IStrategy {
	//每個錦囊妙計都是一個可執行的算法
	public void operate();
}

然後再寫三個實現類,有三個妙計嘛:

package com.sanguo.strategy;

/**
 * 走後門算法
 * */
public class BackDoor implements IStrategy {

	@Override
	public void operate() {
		System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力");
	}

}

package com.sanguo.strategy;

/**
 * 求吳國太開綠燈算法
 * */
public class GivenGreenLight implements IStrategy {

	@Override
	public void operate() {
		System.out.println("求吳國太開綠燈,放行!");
	}

}

package com.sanguo.strategy;

/**
 * 孫夫人斷後擋追兵
 * */
public class BlockEnemy implements IStrategy {

	@Override
	public void operate() {
		System.out.println("孫夫人斷後,擋住追兵");
	}

}

好了,大家看看,三個妙計是有了,那需要有個地方放這些妙計呀,放錦囊呀:

package com.sanguo.strategy;

/**
 * 環境角色,主要完成對特定策略的調用 這裏代表諸葛亮裝計策的錦囊
 * */
public class Context {
	private IStrategy strategy;

	public Context(IStrategy strategy) {
		this.strategy = strategy;// 構造函數,你要使用的計策算法
	}

	//使用計謀,看我出招
	public void operate() {
		this.strategy.operate();
	}
}

然後就是趙雲雄赳赳的揣着三個錦囊,拉着已步入老年行列的、還想着娶純情少女的、色迷迷的劉老爺子去入贅了,嗨,還別說,小亮的三個妙計還真是不錯,瞅瞅:

package com.sanguo.strategy;

public class ZhaoYun {
	public static void main(String[] args) {
		Context context;
		// 剛剛到吳國的時候拆第一個
		context = new Context(new BackDoor()); // 拿到妙計
		context.operate(); // 拆開執行
		// 劉備樂不思蜀了,拆第二個了
		context = new Context(new GivenGreenLight());
		context.operate(); // 執行了第二個錦囊了
		// 孫權的小兵追了,咋辦?拆第三個
		context = new Context(new BlockEnemy());
		context.operate(); // 孫夫人退兵
	}
}

執行結果,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章