索引
意圖
允許在執行時動態靈活的建立新的 "類",而這些類的例項代表著一種不同的物件型別。
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實現方式(二):type object 在遊戲設計中的使用。想象我們正在製作在乙個虛擬角色扮演遊戲。我們的任務是設計一些**的怪獸(monster)來試圖殺掉我們的英雄(hero)。怪獸有著一些不同的屬性,例如生命值(health)、攻擊力(attacks)、影象、聲音等,但以舉例為目的我們僅考慮前兩個屬性。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 }
遊戲中的每個怪獸都有自己的生命值。生命值從滿血開始,每次怪獸被創傷,生命值減少。怪獸會有乙個用於描述攻擊的字串,當怪獸攻擊英雄時,這個字串會被顯示到使用者螢幕上。
遊戲設計師告訴我們,怪獸會有不同的品種(breed),例如:猛龍(dragon)和巨魔(troll)。每個怪獸品種都描述了一種怪獸,在乙個場景下會有多個同一種的怪獸遍布在地牢(dungeon)中。
怪獸的品種(breed)決定的怪獸的起始生命值,比如猛龍(dragon)的生命值會比巨魔(troll)的高,以使猛龍更難被殺掉。同時,同乙個品種的怪獸的攻擊字串也是相同的。
通過典型的 oo 設計,我們能得到下面這段**:
1這段**淺顯易懂,使用繼承的方式設計類的層級結構。乙個 dragon 是乙個 monster,滿足了 "is a" 的關係。每乙個怪物的品種都會用乙個子類來實現。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 }
如果遊戲中有成百上千的怪物種類,則類的繼承關係變得龐大。同時也意味著,增加新的怪物品種就需要增加新的子類**。
這是可以工作的,但並不是唯一的選擇。我們可以嘗試另外一種架構。
因為變化較多的部分是品種(breed)的屬性配置,包括生命值和攻擊字串。
所以我們可以將品種(breed)抽取成單獨的類,每個怪物類(monster)包含乙個品種類(breed)。
breed 類用於定義 monster 的 "type"。每乙個 breed 的例項描述著一種 monster 物件的概念上的 "type"。
1type object 在這裡的優勢在於,我們可以定義新的型別的怪物,而不用修改**。並且可以在執行時動態生成新的物件和修改物件的屬性。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 }
設計模式之美28 命令模式
定義 命令模式將請求 命令 封裝為乙個物件,這樣可以使用不同的請求引數化其他物件 將不同請求依賴注入到其他物件 並且能夠支援請求 命令 的排隊執行 記錄日誌 撤銷等 附加控制 功能。使用不多 命令模式用的最核心的實現手段,是將函式封裝成物件。但是,在大部分程式語言中,函式沒法兒作為引數傳遞給其他函式...
設計模式之美專欄學習
如果說 資料結構與演算法之美 是教你寫出高效的 那這個設計模式專欄就是教你寫出高質量的 寫 可以說是程式設計師天天要幹的事情,要是 都寫不好,最基本的看家本領都練不好,成天堆砌爛 寫 還有啥意思呢?那還幹啥程式設計師啊!寫出 能用 的人比比皆是,但是,並不是每個人都能寫出 好用 的 只會寫能用的 我...
設計模式之美 State(狀態)
索引 意圖 允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類。結構 參與者 context state concretestate 在以下情況下可以使用 state 模式 效果 相關模式 實現 實現方式 一 由 concretestate 指定它的後繼 state。state ...