行為型模式:主要用於管理物件之間的演算法、關係和職責。主要講策略模式、命令模式、觀察者模式、模板模式。
策略模式:定義一系列演算法,將這些演算法封裝起來,並且使演算法之間可以轉換。本質是將演算法和客戶端之間隔離,使得客戶端只能通過抽象演算法類來訪問具體演算法。
假設手機需要支援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...