日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式之策略模式(Strategy)摘录

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之策略模式(Strategy)摘录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

23種GOF設計模式一般分為三大類:創(chuàng)建型模式、結構型模式、行為模式。

創(chuàng)建型模式抽象了實例化過程,它們幫助一個系統(tǒng)獨立于如何創(chuàng)建、組合和表示它的那些對象。一個類創(chuàng)建型模式使用繼承改變被實例化的類,而一個對象創(chuàng)建型模式將實例化委托給另一個對象。創(chuàng)建型模式有兩個不斷出現的主旋律。第一,它們都將關于該系統(tǒng)使用哪些具體的類的信息封裝起來。第二,它們隱藏了這些類的實例是如何被創(chuàng)建和放在一起的。整個系統(tǒng)關于這些對象所知道的是由抽象類所定義的接口。因此,創(chuàng)建型模式在什么被創(chuàng)建,誰創(chuàng)建它,它是怎樣被創(chuàng)建的,以及何時創(chuàng)建這些方面給予了很大的靈活性。它們允許用結構和功能差別很大的“產品”對象配置一個系統(tǒng)。配置可以是靜態(tài)的(即在編譯時指定),也可以是動態(tài)的(在運行時)。

結構型模式涉及到如何組合類和對象以獲得更大的結構。結構型類模式采用繼承機制來組合接口或實現。結構型對象模式不是對接口和實現進行組合,而是描述了如何對一些對象進行組合,從而實現新功能的一些方法。因為可以在運行時刻改變對象組合關系,所以對象組合方式具有更大的靈活性,而這種機制用靜態(tài)類組合是不可能實現的。

行為模式涉及到算法和對象間職責的分配。行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運行時難以跟蹤的復雜的控制流。它們將用戶的注意力從控制流轉移到對象間的聯(lián)系方式上來。行為類模式使用繼承機制在類間分派行為。行為對象模式使用對象復合而不是繼承。一些行為對象模式描述了一組對等的對象怎樣相互協(xié)作以完成其中任一個對象都無法單獨完成的任務。

創(chuàng)建型模式包括:1、FactoryMethod(工廠方法模式);2、Abstract Factory(抽象工廠模式);3、Singleton(單例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).

結構型模式包括:6、Bridge(橋接模式);7、Adapter(適配器模式);8、Decorator(裝飾模式);9、Composite(組合模式);10、Flyweight(享元模式);11、Facade(外觀模式);12、Proxy(代理模式).

行為模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(狀態(tài)模式);16、Observer(觀察者模式);17、Memento(備忘錄模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(訪問者模式);21、Chain of Responsibility(責任鏈模式);22、Iterator(迭代器模式);23、Interpreter(解釋器模式).

Factory Method:定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。

Abstract Factory:提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定他們具體的類。

Singleton:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

Builder:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。

Prototype:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原型來創(chuàng)建新的對象。

Bridge:將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

Adapter:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

Decorator:動態(tài)地給一個對象添加一些額外的職責。就擴展功能而言, Decorator模式比生成子類方式更為靈活。

Composite:將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite使得客戶對單個對象和復合對象的使用具有一致性。

Flyweight:運用共享技術有效地支持大量細粒度的對象。

Facade:為子系統(tǒng)中的一組接口提供一個一致的界面, Facade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。

Proxy:為其他對象提供一個代理以控制對這個對象的訪問。

Template Method:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

Strategy:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。

State:允許一個對象在其內部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它所屬的類。

Observer:定義對象間的一種一對多的依賴關系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。

Memento:在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到保存的狀態(tài)。

Mediator:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

Command:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可取消的操作。

Visitor:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。

Chain of Responsibility:為解除請求的發(fā)送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。

Iterator:提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。

Interpreter:給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。

???????? Strategy:(1)、意圖: 定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。

???????? (2)、適用性:A、許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法。B、需要使用一個算法的不同變體。C、算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構。D、一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。

???????? (3)、優(yōu)缺點:A、相關算法系列:Strategy類層次為Context定義了一系列的可供重用的算法或行為。繼承有助于析取出這些算法中的公共功能。B、一個替代繼承的方法:繼承提供了另一種支持多種算法或行為的方法。你可以直接生成一個Context類的子類,從而給它以不同的行為。但這會將行為硬行編制到Context中,而將算法的實現與Context的實現混合起來,從而使Context難以理解、難以維護和難以擴展,而且還不能動態(tài)地改變算法。最后你得到一堆相關的類,它們之間的唯一差別是它們所使用的算法或行為。將算法封裝在獨立的Strategy類中使得你可以獨立于其Context改變它,使它易于切換、易于理解、易于擴展。C、消除了一些條件語句:Strategy模式提供了用條件語句選擇所需的行為以外的另一種選擇。當不同的行為堆砌在一個類中時,很難避免使用條件語句來選擇合適的行為。將行為封裝在一個個獨立的Strategy類中消除了這些條件語句。D、實現的選擇:Strategy模式可以提供相同行為的不同實現。客戶可以根據不同時間/空間權衡取舍要求從不同策略中進行選擇。E、客戶必須了解不同的Strategy:本模式有一個潛在的缺點,就是一個客戶要選擇一個合適的Strategy就必須知道這些Strategy到底有何不同。此時可能不得不向客戶暴露具體的實現問題。因此僅當這些不同行為變體與客戶相關的行為時,才需要使用Strategy模式。F、Strategy和Context之間的通信開銷:無論各個ConcreteStrategy實現的算法是簡單還是復雜,它們都共享Strategy定義的接口。因此很可能某些ConcreteStrategy不會都用到所有通過這個接口傳遞給它們的信息;簡單的ConcreteStrategy可能不使用其中的任何信息。這就意味著有時Context會創(chuàng)建和初始化一些永遠不會用到的參數。如果存在這樣問題,那么將需要在Strategy和Context之間更進行緊密的耦合。H、增加了對象的數目:Strategy增加了一個應用中的對象的數目。有時你可以將Strategy實現為可供各Context共享的無狀態(tài)的對象來減少這一開銷。任何其余的狀態(tài)都由Context維護。Context在每一次對Strategy對象的請求中都將這個狀態(tài)傳遞過去。共享的Strategy不應在各次調用之間維護狀態(tài)。

???????? (4)、Strategy:定義算法家族,分別封裝起來,讓它們之間可以互相替換,讓算法變化,不會影響到用戶。適合類中的成員以方法為主,算法經常變動;簡化了單元測試(因為每個算法都有自己的類,可以通過自己的接口單獨測試)。策略模式和簡單工廠基本相同,但簡單工廠模式只能解決對象創(chuàng)建問題,對于經常變動的算法應使用策略模式。

???????? (5)、Strategy模式和Template模式要解決的問題是相同(類似)的,都是為了給業(yè)務邏輯(算法)具體實現和抽象接口之間的解耦。Strategy模式將邏輯(算法)封裝到一個類(Context)里面,通過組合的方式將具體算法的實現在組合對象中實現,再通過委托的方式將抽象接口的實現委托給組合對象實現。State模式也有類似的功能。Strategy模式和Template模式實際是實現一個抽象接口的兩種方式:繼承和組合之間的區(qū)別。要實現一個抽象接口,繼承是一種方式:我們將抽象接口聲明在基類中,將具體的實現放在具體子類中。組合(委托)是另外一種方式:我們將接口的實現放在被組合對象中,將抽象接口放在組合類中。這兩種方式各有優(yōu)缺點:A、繼承:優(yōu)點:易于修改和擴展那些被復用的實現。缺點:破壞了封裝性,繼承中父類的實現細節(jié)暴露給子類了;”白盒”復用;當父類的實現更改時,其所有子類將不得不隨之改變;從父類繼承而來的實現在運行期間不能改變(編譯期間就已經確定了)。B、組合:優(yōu)點:“黑盒”復用,因為被包含對象的內部細節(jié)對外是不可見的;封裝性好;實現和抽象的依賴性很小(組合對象和被組合對象之間的依賴性小);可以在運行期間動態(tài)定義實現(通過一個指向相同類型的指針,典型的是抽象基類的指針)。缺點:系統(tǒng)中對象過多。

???????? (6)、Strategy模式和State模式也有相似之處,但是State模式注重的對象在不同的狀態(tài)下不同的操作。兩者之間的區(qū)別就是State模式中具體實現類中一個指向Context的引用,而Strategy模式則沒有。

示例代碼1:

#include <iostream>
using namespace std;//策略基類
class COperation
{
public:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult = 0;return dResult;}
};//策略具體類----加法類
class AddOperation : public COperation
{
public:AddOperation(int a, int b){m_nFirst = a;m_nSecond = b;}virtual double GetResult(){return m_nFirst + m_nSecond;}
};class Context
{
private:COperation* op;
public:Context(COperation* temp){op = temp;}double GetResult(){return op->GetResult();}
};//客戶端
int main()
{int a, b;char c;cin>>a>>b;cout<<"請輸入運算符:";cin>>c;switch (c){case '+': {Context* context = new Context(new AddOperation(a, b));cout<<context->GetResult()<<endl;break; }default:break;}/*result58請輸入運算符:+13*/return 0;
}

示例代碼2:

//策略與工廠結合:客戶端只需訪問Context類,而不用知道其它任何類信息,實現了低耦合。
#include <iostream>
using namespace std;//策略基類
class COperation
{
public:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult = 0;return dResult;}
};//策略具體類----加法類
class AddOperation : public COperation
{
public:AddOperation(int a, int b){m_nFirst = a;m_nSecond = b;}virtual double GetResult(){return m_nFirst + m_nSecond;}
};class Context
{
private:COperation* op;
public:Context(char cType){switch (cType){case '+':op = new AddOperation(5, 8);break;default:break;}}double GetResult(){return op->GetResult();}
};//客戶端
int main()
{int a, b;cin>>a>>b;Context* test = new Context('+');cout<<test->GetResult()<<endl;/*result2513*/return 0;
}

示例代碼3:

Strategy.h:

#ifndef _STRATEGY_H_
#define _STRATEGY_H_class Strategy
{
public:Strategy();virtual ~Strategy();virtual void AlgrithmInterface() = 0;
protected:
private:
};class ConcreteStrategyA : public Strategy
{
public:ConcreteStrategyA();virtual ~ConcreteStrategyA();void AlgrithmInterface();
protected:
private:
};class ConcreteStrategyB : public Strategy
{
public:ConcreteStrategyB();virtual ~ConcreteStrategyB();void AlgrithmInterface();
protected:
private:
};#endif//~_STRATEGY_H_

Strategy.cpp:

#include "Strategy.h"
#include <iostream>using namespace std;Strategy::Strategy()
{}Strategy::~Strategy()
{cout<<"~Strategy ..."<<endl;
}void Strategy::AlgrithmInterface()
{}ConcreteStrategyA::ConcreteStrategyA()
{}ConcreteStrategyA::~ConcreteStrategyA()
{cout<<"~ConcreteStrategy ..."<<endl;
}void ConcreteStrategyA::AlgrithmInterface()
{cout<<"test ConcreteStrategyA ..."<<endl;
}ConcreteStrategyB::ConcreteStrategyB()
{}ConcreteStrategyB::~ConcreteStrategyB()
{cout<<"~ConcreteStrategyB ..."<<endl;
}void ConcreteStrategyB::AlgrithmInterface()
{cout<<"test ConcreteStrategyB ..."<<endl;
}

Context.h:

#ifndef _CONTEXT_H_
#define _CONTEXT_H_class Strategy;
/*
這個類是Strategy模式的關鍵,也是Strategy模式和Template模式的根本區(qū)別所在。
Strategy通過"組合"(委托)方式實現算法(實現)的異構,而Template模式則采取的是繼承的方式。
這兩個模式的區(qū)別也是繼承和組合兩種實現接口重用的方式的區(qū)別
*/class Context
{
public:Context(Strategy* stg);~Context();void DoAction();
protected:
private:Strategy* _stg;
};#endif//~_CONTEXT_H_

Context.cpp:

#include "Context.h"
#include "Strategy.h"
#include <iostream>using namespace std;Context::Context(Strategy* stg)
{_stg = stg;
}Context::~Context()
{if (!_stg)delete _stg;
}void Context::DoAction()
{_stg->AlgrithmInterface();
}

main.cpp:

#include "Context.h"
#include "Strategy.h"
#include <iostream>using namespace std;int main()
{Strategy* ps = new ConcreteStrategyA();Context* pc = new Context(ps);pc->DoAction();if (NULL != pc)delete pc;/*resulttest ConcreteStrategyA ...*/return 0;
}

策略模式結構圖:


參考文獻:

1、《大話設計模式C++》

2、《設計模式精解----GoF23種設計模式解析》

3、《設計模式----可復用面向對象軟件的基礎》

總結

以上是生活随笔為你收集整理的设计模式之策略模式(Strategy)摘录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

歡迎分享!

轉載請說明來源于"生活随笔",并保留原作者的名字。

本文地址:设计模式之策略模式(Strategy)摘录