日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式之美:Type Object(类型对象)

發(fā)布時(shí)間:2025/6/16 asp.net 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之美:Type Object(类型对象) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

索引

  • 意圖
  • 結(jié)構(gòu)
  • 參與者
  • 適用性
  • 效果
  • 相關(guān)模式
  • 實(shí)現(xiàn)
    • 實(shí)現(xiàn)方式(一):Type Object 的經(jīng)典介紹。
    • 實(shí)現(xiàn)方式(二):Type Object 在游戲設(shè)計(jì)中的使用。

意圖

允許在運(yùn)行時(shí)動(dòng)態(tài)靈活的創(chuàng)建新的 "類(lèi)",而這些類(lèi)的實(shí)例代表著一種不同的對(duì)象類(lèi)型。

Allow the flexible creation of new “classes” by creating a single class, each instance of which represents a different type of object.

結(jié)構(gòu)

Type Object 模式包含兩個(gè)具體類(lèi)。一個(gè)用于描述對(duì)象,另一個(gè)用于描述類(lèi)型。每個(gè)對(duì)象都包含一個(gè)指向其類(lèi)型的指針。

參與者

TypeClass

  • 是 TypeObject 的種類(lèi)。
  • 每個(gè)種類(lèi)都會(huì)有一個(gè)單獨(dú)的類(lèi)。

TypeObject

  • 是 TypeClass 的實(shí)例。
  • 代表著一種對(duì)象。定義一種對(duì)象所包含的屬性和行為。

適用性

當(dāng)以下情況成立時(shí)可以使用 Type Object 模式:

  • 類(lèi)的實(shí)例需要根據(jù)它們的通用屬性或者行為進(jìn)行分組。
  • 類(lèi)需要為每個(gè)分組定義一個(gè)子類(lèi)來(lái)實(shí)現(xiàn)該分組的通用屬性和行為。
  • 類(lèi)需要大量的子類(lèi)或者多種變化的子類(lèi)甚至無(wú)法預(yù)期子類(lèi)的變化。
  • 你需要有能力在運(yùn)行時(shí)創(chuàng)建一些無(wú)法在設(shè)計(jì)階段預(yù)測(cè)的新的分組。
  • 你需要有能力在類(lèi)已經(jīng)被實(shí)例化的條件下更改一個(gè)對(duì)象的子類(lèi)。

效果

  • 運(yùn)行時(shí)創(chuàng)建新的類(lèi)型對(duì)象。
  • 避免子類(lèi)膨脹。
  • 客戶(hù)程序無(wú)需了解實(shí)例與類(lèi)型的分離。
  • 可以動(dòng)態(tài)的更改類(lèi)型。

相關(guān)模式

  • Type Object 模式有些類(lèi)似于?Strategy?和?State?模式。這三種模式都是通過(guò)將對(duì)象內(nèi)部的一些行為代理到外部的對(duì)象中。Stategy 和 State 通常是純行為的代理,而 Type Object 則包含更多個(gè)共享數(shù)據(jù)狀態(tài)。State 可以被頻繁的更改,Type Object 則很少被改變。Strategy 通常僅包含一個(gè)職責(zé),Type Object 則通常包含多個(gè)職責(zé)。
  • Type Object 的實(shí)現(xiàn)與?Bridge?模式中的 Abstraction 和 Implementor 的關(guān)系很像。區(qū)別在于,客戶(hù)程序可以與 Type Object 直接協(xié)作,而不會(huì)直接與 Implementor 進(jìn)行交互。
  • Type Object 有點(diǎn)像?Flyweight?一樣處理它的對(duì)象。兩個(gè)對(duì)象使用相同的 Type Object 可能看起來(lái)是使用的各自的實(shí)例,但實(shí)際是共享的對(duì)象。
  • Type Object 可以解決多個(gè)對(duì)象共享數(shù)據(jù)和行為的問(wèn)題。類(lèi)似的問(wèn)題也可以用?Prototype?模式來(lái)解決。

實(shí)現(xiàn)

實(shí)現(xiàn)方式(一):Type Object 的經(jīng)典介紹。

  • TypeClass?- Movie
  • TypeObject?- Star Wars, The Terminator, Independence Day
  • Class?- Videotape
  • Object?- John's Star Wars, Sue's Star Wars
1 namespace TypeObjectPattern.Implementation1 2 { 3 public class Movie 4 { 5 public string Title { get; set; } 6 public float RentalPrice { get; set; } 7 } 8 9 public class Videotape 10 { 11 public Videotape(Movie movie) 12 { 13 this.Movie = movie; 14 } 15 16 public Movie Movie { get; private set; } 17 18 public Customer Renter { get; private set; } 19 public bool IsRented { get; private set; } 20 21 public void RentTo(Customer customer) 22 { 23 IsRented = true; 24 Renter = customer; 25 Renter.ChargeForRental(this.Movie.RentalPrice); 26 } 27 } 28 29 public class Customer 30 { 31 public string Name { get; set; } 32 33 public void ChargeForRental(float rental) 34 { 35 // pay money 36 } 37 } 38 39 public class Client 40 { 41 public void TestCase1() 42 { 43 Customer john = new Customer() { Name = "John" }; 44 Customer sue = new Customer() { Name = "Sue" }; 45 46 Movie starWars = new Movie() 47 { 48 Title = "Star Wars", 49 RentalPrice = 100, 50 }; 51 Movie terminator = new Movie() 52 { 53 Title = "The Terminator", 54 RentalPrice = 200, 55 }; 56 57 Videotape starWarsVideotapeForJohn = new Videotape(starWars); 58 starWarsVideotapeForJohn.RentTo(john); 59 60 Videotape starWarsVideotapeForSue = new Videotape(starWars); 61 starWarsVideotapeForSue.RentTo(john); 62 63 Videotape terminatorVideotapeForJohn = new Videotape(terminator); 64 terminatorVideotapeForJohn.RentTo(john); 65 } 66 } 67 }

實(shí)現(xiàn)方式(二):Type Object 在游戲設(shè)計(jì)中的使用。

想象我們正在制作在一個(gè)虛擬角色扮演游戲。我們的任務(wù)是設(shè)計(jì)一些邪惡的怪獸(Monster)來(lái)試圖殺掉我們的英雄(Hero)。怪獸有著一些不同的屬性,例如生命值(Health)、攻擊力(Attacks)、圖像、聲音等,但以舉例為目的我們僅考慮前兩個(gè)屬性。

游戲中的每個(gè)怪獸都有自己的生命值。生命值從滿(mǎn)血開(kāi)始,每次怪獸被創(chuàng)傷,生命值減少。怪獸會(huì)有一個(gè)用于描述攻擊的字符串,當(dāng)怪獸攻擊英雄時(shí),這個(gè)字符串會(huì)被顯示到用戶(hù)屏幕上。

游戲設(shè)計(jì)師告訴我們,怪獸會(huì)有不同的品種(Breed),例如:猛龍(Dragon)和巨魔(Troll)。每個(gè)怪獸品種都描述了一種怪獸,在一個(gè)場(chǎng)景下會(huì)有多個(gè)同一種的怪獸遍布在地牢(Dungeon)中。

怪獸的品種(Breed)決定的怪獸的起始生命值,比如猛龍(Dragon)的生命值會(huì)比巨魔(Troll)的高,以使猛龍更難被殺掉。同時(shí),同一個(gè)品種的怪獸的攻擊字符串也是相同的。

通過(guò)典型的 OO 設(shè)計(jì),我們能得到下面這段代碼:

1 namespace TypeObjectPattern.Implementation2 2 { 3 public abstract class Monster 4 { 5 public Monster(int startingHealth) 6 { 7 Health = startingHealth; 8 } 9 10 public int Health { get; private set; } 11 public abstract string AttackString { get; } 12 } 13 14 public class Dragon : Monster 15 { 16 public Dragon() 17 : base(500) 18 { 19 } 20 21 public override string AttackString 22 { 23 get { return "The dragon breathes fire!"; } 24 } 25 } 26 27 public class Troll : Monster 28 { 29 public Troll() 30 : base(300) 31 { 32 } 33 34 public override string AttackString 35 { 36 get { return "The troll clubs you!"; } 37 } 38 } 39 40 public class Client 41 { 42 public void TestCase2() 43 { 44 Monster dragon = new Dragon(); 45 Monster troll = new Troll(); 46 } 47 } 48 }

這段代碼淺顯易懂,使用繼承的方式設(shè)計(jì)類(lèi)的層級(jí)結(jié)構(gòu)。一個(gè) Dragon 是一個(gè) Monster,滿(mǎn)足了 "is a" 的關(guān)系。每一個(gè)怪物的品種都會(huì)用一個(gè)子類(lèi)來(lái)實(shí)現(xiàn)。

如果游戲中有成百上千的怪物種類(lèi),則類(lèi)的繼承關(guān)系變得龐大。同時(shí)也意味著,增加新的怪物品種就需要增加新的子類(lèi)代碼。

這是可以工作的,但并不是唯一的選擇。我們可以嘗試另外一種架構(gòu)。

因?yàn)樽兓^多的部分是品種(Breed)的屬性配置,包括生命值和攻擊字符串。

所以我們可以將品種(Breed)抽取成單獨(dú)的類(lèi),每個(gè)怪物類(lèi)(Monster)包含一個(gè)品種類(lèi)(Breed)。

Breed 類(lèi)用于定義 Monster 的 "type"。每一個(gè) Breed 的實(shí)例描述著一種 Monster 對(duì)象的概念上的 "type"。

1 namespace TypeObjectPattern.Implementation3 2 { 3 public class Breed 4 { 5 public int Health { get; set; } 6 public string AttackString { get; set; } 7 } 8 9 public class Monster 10 { 11 private Breed _breed; 12 13 public Monster(Breed breed) 14 { 15 _breed = breed; 16 } 17 18 public int Health 19 { 20 get { return _breed.Health; } 21 } 22 23 public string AttackString 24 { 25 get { return _breed.AttackString; } 26 } 27 } 28 29 public class Client 30 { 31 public void TestCase3() 32 { 33 Breed dragonBreed = new Breed() 34 { 35 Health = 500, 36 AttackString = "The dragon breathes fire!", 37 }; 38 Breed trollBreed = new Breed() 39 { 40 Health = 300, 41 AttackString = "The troll clubs you!", 42 }; 43 44 Monster dragon = new Monster(dragonBreed); 45 Monster breed = new Monster(trollBreed); 46 } 47 } 48 }

Type Object 在這里的優(yōu)勢(shì)在于,我們可以定義新的類(lèi)型的怪物,而不用修改代碼。并且可以在運(yùn)行時(shí)動(dòng)態(tài)生成新的對(duì)象和修改對(duì)象的屬性。

參考資料

  • Type Object - Game Programming Patterns
  • The Type Object Pattern







本文轉(zhuǎn)自匠心十年博客園博客,原文鏈接:http://www.cnblogs.com/gaochundong/p/design_pattern_type_object.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者


總結(jié)

以上是生活随笔為你收集整理的设计模式之美:Type Object(类型对象)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。