物件導向程式設計第七次實驗課 狀態模式

2021-08-04 04:29:15 字數 3387 閱讀 7579

題目要求是自己開腦洞想乙個狀態模式的例子,實現之。

例子詳見後文。

狀態模式簡介:

#pragma once

#include "person.h"

class person;

class state

;

#include "state.h"

#include "person.h"

#include

using

namespace

std;

void state::sleep(person *per)

#pragma once

#include "state.h"

class exciting : public state

;

#include 

#include "exciting.h"

#include "person.h"

#include "sad.h"

#include "soso.h"

using

namespace

std;

void exciting::study(person *per)

void exciting::play(person *per)

void exciting::eat(person *per)

void exciting::exam(person *per)

#pragma once

#include "state.h"

;

#include "exciting.h"

#include "person.h"

#include "sad.h"

#include "soso.h"

#include

using

namespace

std;

#pragma once

#include "state.h"

class soso : public state

;

#include "soso.h"

#include "person.h"

#include "sad.h"

#include "exciting.h"

#include

using

namespace

std;

void soso::study(person *per)

void soso::play(person *per)

void soso::eat(person *per)

void soso::exam(person *per)

#pragma once

#include "state.h"

class sad: public state

;

#include "person.h"

#include "sad.h"

#include "soso.h"

#include "exciting.h"

#include

using

namespace

std;

void sad::study(person *per)

void sad::play(person *per)

void sad::eat(person *per)

void sad::exam(person *per)

#pragma once

#include "state.h"

class state;

class person

;

#include "person.h"

#include "exciting.h"

#include "soso.h"

#include "sad.h"

#include

using

namespace

std;

person::person(state *state) : m_state(state) {}

const state* person::getstate(void)

void person::setstate(state *state)

state* person::getnewstate(void)

}}void person::eat(void)

void person::exam(void)

void person::study(void)

void person::play(void)

void person::sleep(void)

#include 

#include "group.h"

#include "decorator.h"

#include "life.h"

#include "business.h"

#include "study.h"

#include

using

namespace

std;

int main(int argc, char** argv)

一、 場景描述

首先說一下自己對於狀態模式的理解。乙個物件可能會在不同的時間不同的地點不同的情況會有不同的狀態,而對應於不同的狀態,這個物件的部分行為會有所改變,這就是狀態模式出現的原因。我認為狀態模式是用於解決乙個這樣乙個情形:物件會有較多的狀態,同時又有相當一部分行為會因為狀態的改變而改變。

狀態模式的基本模型是這樣的,有乙個具體的類描述一種事務,充當使用者介面,並持有乙個state類的指標。state類是乙個抽象類,是所有具體狀態的父類,它擁有關聯類基於狀態的行為的實現,規定了所有子類應該定義的行為。每乙個具體的狀態類依據狀態定義行為。

person類中擁有乙個state型別的指標m_state,動態型別是state的子類之一,在執行行為的時候,呼叫m_state指向物件的行為,行為過後,person中m_state的動態型別可能改變。

二、 多型

為什麼要多型呢?注意,狀態模式要求對於不同的狀態,物件的行為會發生改變。顯然,這個狀態並不是編譯時確定的,而是執行時才能確定的,這符合多型的定義。因此,多型可以解決這一問題,只要把不同的狀態抽象成不同的類,並使用乙個相同的祖先類管理這些類,就可以用多型的思想解決問題。

第七次實驗

part 1 驗證性實驗2 對line29作修改後 include include define n 10 定義乙個結構體型別stu typedef struct student stu intmain stmax.score 0 先假定最高分是0,後面如發現比當前最高分還高的分數,就更新最高分 s...

FICO第七次課

分類帳 m a5 n.x i u 9 f v y j8 i.j y 中國公司在美國上市,需要同時對兩個國家出具會計報表。但由於會計核算方法不一致。就需要另外一套帳,即分類賬。c4 p5 9 p 1 乙個主帳,乙個輔帳,乙個主帳還可以對應多個輔帳。l w m i 2 m3 x q 2 f 02記賬的時...

第七次課作業

定義乙個矩形類rectangle 知識點 物件的建立和使用 1 定義三個方法 getarea 求面積 getper 求周長,showall 分別在控制台輸出長 寬 面積 周長。2 有2個屬性 長length 寬width 3 建立乙個rectangle物件,並輸出相關資訊 package huaer...