軟體工程設計模式——行為型模式之策略模式簡要概述
行為型模式之——策略模式
行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。本文所介紹的策略模式即屬於後者物件行為模式。
前言
行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作
共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。
一、什麼是策略模式?
當實現某一個功能存在多種演算法或者策略,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能,如資料排序策略有氣泡排序、選擇排序、插入排序、二叉樹排序等。如果使用多重條件轉移語句實現(即硬編碼),不但使條件語句變得很複雜,而且增加、刪除或更換演算法要修改原始碼,不易維護,違背開閉原則。如果採用策略模式就能很好解決該問題。
二、策略模式詳解
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();
}
}
相關文章
- 設計模式之【策略模式】設計模式
- 設計模式之策略模式設計模式
- 行為型模式之策略模式模式
- 極簡設計模式-策略模式設計模式
- 略懂設計模式之策略模式設計模式
- PHP 設計模式之策略模式PHP設計模式
- python設計模式之策略模式Python設計模式
- JavaScript 設計模式之策略模式JavaScript設計模式
- Javascript設計模式之策略模式JavaScript設計模式
- JAVA設計模式之策略模式Java設計模式
- 行為型設計模式設計模式
- 設計模式(十九)----行為型模式之命令模式設計模式
- Java設計模式之策略模式示例Java設計模式
- Java設計模式之(十四)——策略模式Java設計模式
- 設計模式漫談之策略模式設計模式
- javascript設計模式 之 2 策略模式JavaScript設計模式
- 設計模式之中介者模式(行為型)設計模式
- 軟體設計模式系列之二十三——策略模式設計模式
- 軟體設計模式白話文系列(十四)策略模式設計模式
- 設計模式-策略模式設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 軟體設計模式系列之十六——命令模式設計模式
- 聊一聊設計模式(四)-- 行為型設計模式設計模式
- 設計模式:Builder模式概述設計模式UI
- 設計模式之概述篇設計模式
- 行為型模式--策略模式模式
- (Java)設計模式:行為型Java設計模式
- 行為型設計模式 - 狀態模式詳解設計模式
- JavaScript設計模式之建立型設計模式JavaScript設計模式
- 軟體設計模式————(代理模式)設計模式
- 1/24 設計模式之策略設計模式 Strategy Pattern設計模式
- 設計模式 #5 (策略模式、代理模式)設計模式
- 軟體設計模式系列之十三——享元模式設計模式
- 軟體設計模式系列之十二——外觀模式設計模式
- 軟體設計模式系列之十八——迭代器模式設計模式
- 軟體設計模式系列之十九——中介者模式設計模式
- 軟體設計模式系列之十——組合模式設計模式