設計模式之美 Type Object(型別物件)

2021-09-22 11:14:16 字數 4083 閱讀 4352

索引

意圖

允許在執行時動態靈活的建立新的 "類",而這些類的例項代表著一種不同的物件型別。

allow the flexible creation of new 「classes」 by creating a single class, each instance of which represents a different type of object.

結構

type object 模式包含兩個具體類。乙個用於描述物件,另乙個用於描述型別。每個物件都包含乙個指向其型別的指標。

參與者

typeclass

typeobject

當以下情況成立時可以使用 type object 模式:

效果

相關模式

實現

實現方式(一):type object 的經典介紹。

1

namespace

typeobjectpattern.implementation126

public

float rentalprice 7}

89public

class

videotape

1015

16public movie movie

1718

public customer renter

19public

bool isrented

2021

public

void

rentto(customer customer)

2227}28

29public

class

customer

3032

33public

void chargeforrental(float

rental)

3437}38

39public

class

client40;

44 customer sue = new customer() ;

4546 movie starwars = new

movie()47;

51 movie terminator = new

movie()52;

5657 videotape starwarsvideotapeforjohn = new

videotape(starwars);

58starwarsvideotapeforjohn.rentto(john);

5960 videotape starwarsvideotapeforsue = new

videotape(starwars);

61starwarsvideotapeforsue.rentto(john);

6263 videotape terminatorvideotapeforjohn = new

videotape(terminator);

64terminatorvideotapeforjohn.rentto(john);65}

66}67 }

實現方式(二):type object 在遊戲設計中的使用。想象我們正在製作在乙個虛擬角色扮演遊戲。我們的任務是設計一些**的怪獸(monster)來試圖殺掉我們的英雄(hero)。怪獸有著一些不同的屬性,例如生命值(health)、攻擊力(attacks)、影象、聲音等,但以舉例為目的我們僅考慮前兩個屬性。

遊戲中的每個怪獸都有自己的生命值。生命值從滿血開始,每次怪獸被創傷,生命值減少。怪獸會有乙個用於描述攻擊的字串,當怪獸攻擊英雄時,這個字串會被顯示到使用者螢幕上。

遊戲設計師告訴我們,怪獸會有不同的品種(breed),例如:猛龍(dragon)和巨魔(troll)。每個怪獸品種都描述了一種怪獸,在乙個場景下會有多個同一種的怪獸遍布在地牢(dungeon)中。

怪獸的品種(breed)決定的怪獸的起始生命值,比如猛龍(dragon)的生命值會比巨魔(troll)的高,以使猛龍更難被殺掉。同時,同乙個品種的怪獸的攻擊字串也是相同的。

通過典型的 oo 設計,我們能得到下面這段**:

1

namespace

typeobjectpattern.implementation229

10public

int health

11public

abstract

string attackstring 12}

1314

public

class

dragon : monster

1520

21public

override

string

attackstring

2224}25

}2627public

class

troll : monster

2833

34public

override

string

attackstring

3537}38

}3940public

class

client

4147

}48 }

這段**淺顯易懂,使用繼承的方式設計類的層級結構。乙個 dragon 是乙個 monster,滿足了 "is a" 的關係。每乙個怪物的品種都會用乙個子類來實現。

如果遊戲中有成百上千的怪物種類,則類的繼承關係變得龐大。同時也意味著,增加新的怪物品種就需要增加新的子類**。

這是可以工作的,但並不是唯一的選擇。我們可以嘗試另外一種架構。

因為變化較多的部分是品種(breed)的屬性配置,包括生命值和攻擊字串。

所以我們可以將品種(breed)抽取成單獨的類,每個怪物類(monster)包含乙個品種類(breed)。

breed 類用於定義 monster 的 "type"。每乙個 breed 的例項描述著一種 monster 物件的概念上的 "type"。

1

namespace

typeobjectpattern.implementation326

public

string attackstring 7}

89public

class

monster

1017

18public

inthealth

1921}22

23public

string

attackstring

2426}27

}2829public

class

client30;

38 breed trollbreed = new

breed()39;

4344 monster dragon = new

monster(dragonbreed);

45 monster breed = new

monster(trollbreed);46}

47}48 }

type object 在這裡的優勢在於,我們可以定義新的型別的怪物,而不用修改**。並且可以在執行時動態生成新的物件和修改物件的屬性。

設計模式之美28 命令模式

定義 命令模式將請求 命令 封裝為乙個物件,這樣可以使用不同的請求引數化其他物件 將不同請求依賴注入到其他物件 並且能夠支援請求 命令 的排隊執行 記錄日誌 撤銷等 附加控制 功能。使用不多 命令模式用的最核心的實現手段,是將函式封裝成物件。但是,在大部分程式語言中,函式沒法兒作為引數傳遞給其他函式...

設計模式之美專欄學習

如果說 資料結構與演算法之美 是教你寫出高效的 那這個設計模式專欄就是教你寫出高質量的 寫 可以說是程式設計師天天要幹的事情,要是 都寫不好,最基本的看家本領都練不好,成天堆砌爛 寫 還有啥意思呢?那還幹啥程式設計師啊!寫出 能用 的人比比皆是,但是,並不是每個人都能寫出 好用 的 只會寫能用的 我...

設計模式之美 State(狀態)

索引 意圖 允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。結構 參與者 context state concretestate 在以下情況下可以使用 state 模式 效果 相關模式 實現 實現方式 一 由 concretestate 指定它的後繼 state。state ...