軟體工程設計模式——行為型模式之策略模式簡要概述

LoveAngel22發表於2020-12-10

行為型模式之——策略模式

行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。本文所介紹的策略模式即屬於後者物件行為模式。



前言

行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作
共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。


一、什麼是策略模式?

當實現某一個功能存在多種演算法或者策略,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能,如資料排序策略有氣泡排序、選擇排序、插入排序、二叉樹排序等。如果使用多重條件轉移語句實現(即硬編碼),不但使條件語句變得很複雜,而且增加、刪除或更換演算法要修改原始碼,不易維護,違背開閉原則。如果採用策略模式就能很好解決該問題。

二、策略模式詳解

1.模式的定義與特點

策略(Strategy)模式的定義:該模式定義了一系列演算法,並將每個演算法封裝起來,使它們
可以相互替換,且演算法的變化不會影響使用演算法的客戶。策略模式屬於物件行為模式,它通過對演算法進行封裝,把使用演算法的責任和演算法的實現分割開來,並委派給不同的物件對這些
演算法進行管理。

策略模式的主要優點如下:

a) 多重條件語句不易維護,而使用策略模式可以避免使用多重條件語句。
b) 策略模式提供了一系列的可供重用的演算法族,恰當使用繼承可以把演算法族的公共程式碼轉
移到父類裡面,從而避免重複的程式碼。
c)策略模式可以提供相同行為的不同實現,客戶可以根據不同時間或空間要求選擇不同的。
d) 策略模式提供了對開閉原則的完美支援,可以在不修改原始碼的情況下,靈活增加新算
法。
e) 策略模式把演算法的使用放到環境類中,而演算法的實現移到具體策略類中,實現了二者的
分離。

2.模式組織與實現

策略模式是準備一組演算法,並將這組演算法封裝到一系列的策略類裡面,作為一個抽象策略類
的子類。策略模式的重心不是如何實現演算法,而是如何組織這些演算法,從而讓程式結構更加
靈活,具有更好的維護性和擴充套件性。
策略模式的主要角色如下:
a) 抽象策略(Strategy)類:定義了一個公共介面,各種不同的演算法以不同的方式實現
這個介面,環境角色使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。
b) 具體策略(Concrete Strategy)類:實現了抽象策略定義的介面,提供具體的演算法實
現。
c) 環境(Context)類:持有一個策略類的引用,最終給客戶端呼叫。
在這裡插入圖片描述


三、例項

實現了策略模式一個簡單例子:

程式碼如下:

public class StrategyPattern {
	
	public static void main(String[] args) {
		
		//獲取環境物件
		Context c = new Context();
		
		//獲取策略物件
		Strategy s = new ConcreteStrategyA();
		
		//把策略物件傳給環境物件的成員變數
		c.setStrategy(s);
		
		//執行環境物件提供的對應方法
		c.strategyMethod();
		
		System.out.println("-----------------");
		
		Strategy b = new ConcreteStrategyB();
		c.setStrategy(b);
		c.strategyMethod();
		}
}

抽象策略類:

//抽象策略類

public interface Strategy {
	
	public void strategyMethod(); //策略方法

}

具體策略類A:

//具體策略類A

public class ConcreteStrategyA implements Strategy {
	
	public void strategyMethod() {
		
		System.out.println("具體策略A的策略方法被訪問!");
		
	}
}

具體策略類B:

//具體策略類B

public class ConcreteStrategyB implements Strategy{
	
	public void strategyMethod() {
		
		System.out.println("具體策略B的策略方法被訪問!");
		
	}
}

環境類:

//環境類

public class Context {

	private Strategy strategy;
	
	public Strategy getStrategy() {
		return strategy;
	}
	
	public void setStrategy(Strategy strategy) {
		this.strategy = strategy;
	}
	
	public void strategyMethod() {
		strategy.strategyMethod();
	}

}

相關文章