C 高階(語法篇) 第11章 設計模式(2)

2021-08-29 01:40:25 字數 4234 閱讀 6601

行為型模式:主要用於管理物件之間的演算法、關係和職責。主要講策略模式、命令模式、觀察者模式、模板模式。

策略模式:定義一系列演算法,將這些演算法封裝起來,並且使演算法之間可以轉換。本質是將演算法和客戶端之間隔離,使得客戶端只能通過抽象演算法類來訪問具體演算法。

假設手機需要支援3種使用模式,分別是標準模式、駕車模式、飛行模式。現在你是手機的開發者,該如何設計應用程式?如果將來手機還要支援靜音模式,又該如何設計?

#include

using

namespace std;

//模式:介面

class mode

virtual

void usemode(void) = 0;

};//標準模式

class standardmode:public mode

;//駕車模式

class drivingmode:public mode

;//飛行模式

class flightmode:public mode

;//手機模式

class phonemode

void usemode()

};int main(int argc,char ** argv)

執行結果:

standard mode!

driving mode!

flight mode!

策略模式結構圖:

context:環境角色,持有乙個對stratery的引用,最終給客戶端使用。相當於phonemode。

stratery:抽象策略類,相當於mode。

concretestratery:具體策略類,相當於standardmode、drivingmode、flightmode。

策略模式和簡單工廠模式看起來很相似,都是通過多型來實現不同子類的選取。簡單工廠模式是工廠根據需求來建立物件(產品),然後將事情交給物件去完成。策略模式是環境角色根據自己選擇的策略來建立物件,這個物件是其本身,因此所有的事情還是自己來完成。難以理解的話,可以看看模式結構圖。

餐館服務員接收到乙份訂單:客戶要求先來乙份烤肉再來乙份炒菜(烤肉在前,炒菜在後);服務員接收到烤肉命令和炒菜命令,然後執行命令(但命令的真正實現不是服務員);廚師接收到烤肉命令和炒菜命令後,開始幹活。

#pragma

once

#include

using

namespace

std;

//廚師

class

cook

//炒菜

void

stirfry(

void)

};#pragma

once

#include

"receiver.h"

class

command

command(

cook

* cook)

virtual

void

execute(

void

) = 0;

protected:

cook

* cook; };

//烤肉命令

class

barbecuecommand

:public

command

barbecuecommand(

cook

* cook)

void

execute(

void)

};class

stirfrycommand

:public

command

stirfrycommand(

cook

* cook)

void

execute(

void)

};#pragma

once

#include

"command.h"

#include

class

waiter ;

// 新增命令

void

addcmd(

command

*cmd)

// 刪除命令

void

deletecmd(

command

*cmd)

// 執行命令

void

notify()

} private:

std::

list

<

command

*> cmds;  

// 命令佇列 };

#include

#include

"invoker.h"

#include

"receiver.h"

#include

"command.h"

using

namespace

std;

intmain(

intargc

, char

** argv)

執行結果:

barbecuecommand::execute

barbecue...

stirfrycommand::execute

stirfry

命令模式結構圖:

invoker:命令的持有者和執行者;

command:命令的抽象類;

concretecommand:命令的具體類;

receiver:命令的接收者和實際執行者;

命令模式難以理解,舉個實際例子:打車客戶(client)發出打車命令->滴滴平台(invoker)接收到命令,然後發出打車命令->滴滴師傅(receiver)接收到打車命令,然後去目標地點接人。通用例子:client發出命令->invoker持有,加入命令佇列,然後執行命令->receiver接收和開始幹活。

觀察者模式:定義物件間一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴它的物件得到通知並自動更新。

假設小明爸爸和小明媽媽關注小明的成績,當小明考試成績出來時,需要及時通知小明的父母,該如何設計這個程式?

#include

#include

using

namespace

std;

class

subject;

class

observer;

//抽象目標:subject

class

subject ;

//抽象觀察者:observer

class

observer ;

//具體目標:concretesubject

class

student

: public

subject

void

detach(

observer

* pobserver)

void

notify()

} void

setvalue(

double

achievement)

};//具體觀察者:concreteobserver

class

father

:public

observer

father(

subject

* psubject)

void

update(

double

achievement)

};class

mother

: public

observer

mother(

subject

* psubject)

void

update(

double

achievement)

};int

main(

intargc

, char

** argv)

執行結果:

孩子成績:60

孩子成績:60

觀察者模式結構圖:

subject(抽象目標):知道所有觀察者,並提供註冊和刪除觀察者的介面;

observer(抽象觀察者):為具體觀察者提供介面,在得到目標的通知時進行自我更新。

concretesubject(具體目標):當具體目標的狀態發生改變,通知所有觀察者。

concreteobserver(具體觀察者):實現更新介面update。

大話設計模式C 實現 第18章

一 uml圖 二 概念 備忘錄 memento 在不破壞封裝性的前提下,捕獲乙個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將物件恢復到原先儲存的狀態。三 說明 角色 1 originator 發起人 負責建立乙個memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態...

大話設計模式C 實現 第25章

一 uml 二 概念 中介者模式 mediator 用乙個中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。三 說明 角色 1 colleague 抽象同事類。2 concreteclleague 具體同事類,每個具體同事只知道自...

C 高階程式設計第11版 附贈第一章

microsoft composition是乙個用來構建元件 part 和容器 container 之間依賴關係 independency 的框架。元件可以被容器使用,而容器無需知道具體實現和細節。容器只需要乙個契約 contract 例如,乙個使用元件的介面。microsoft compositi...