日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 高清乱码免费 | 亚洲视频网站在线 | 特级西西444www大精品视频免费看 | 精品国产精品三级精品av网址 | 欧美一级片在线免费观看 | 俄罗斯porn| 欧美韩国日本一区 | 免费在线你懂的 | 国内精品999 | 黄色片成年人 | 日本道中文字幕 | 亚洲播放器 | 国产成人免费片在线观看 | 又大又长粗又爽又黄少妇视频 | 青青草av | 亚洲欧美中文字幕 | 深夜毛片 | 欧美日韩一区二 | caoporn视频在线观看 | 国产成人啪精品午夜在线观看 | 一区二区久久精品66国产精品 | 五月天综合网 | 日韩在线不卡视频 | 中文字幕有码在线播放 | 在线视频亚洲色图 | 大j8福利视频导航 | 娇妻av| 一级黄色性片 | 香蕉伊人网 | 亚洲黄页 | 色偷偷综合| 中文字幕日韩一级 | 一区二区三区四区五区六区 | 成年人免费看 | 亚洲国产精品一区二区尤物区 | 亚洲骚片 | 夜夜春影院 | 九九爱视频 | 女人被狂躁60分钟视频 | 欧洲av一区二区 | 欧美无专区 | 在线色导航| 国产精品4区 | 亚洲国产日韩欧美一区二区三区 | 久久久久久久久99 | 久久超碰av | 香蕉在线影院 | 亚洲综合国产 | 与亲女洗澡时伦了毛片 | 成年人看的视频网站 | 日本一区二区三区久久 | 久久免费激情视频 | 老熟妇精品一区二区三区 | 久久久国产精品视频 | 老湿影院av | 亚洲男女在线 | 日韩一级免费看 | 国产女大学生av | 亚洲久久久 | 自拍三级 | 国产欧美日韩二区 | 成人午夜在线播放 | 天天射网 | 网红福利视频 | www.啪啪| 欧日韩视频 | 亚洲在线一区二区 | 国产精品自产拍在线观看 | 色偷偷资源 | 亚洲成人网络 | brazzers欧美一区二区 | 香蕉久草 | 日本少妇久久 | 久草超碰 | 老司机深夜视频 | 九九九亚洲 | 深夜视频在线 | 2021毛片| 日本人做受免费视频 | 懂色av蜜臀av粉嫩av分 | 视频一区二区三区在线观看 | 丨国产丨调教丨91丨 | 美女极度色诱图片www视频 | 色综合久久综合 | 欧美一区二区三区久久精品 | 俄罗斯女人裸体性做爰 | 日韩欧美精品免费 | 搡老熟女老女人一区二区 | 亚洲欧美国产一区二区三区 | 成年人在线免费观看视频网站 | 久久艹综合 | 高清一区二区三区视频 | 久久久久久久久艹 | 日韩精品久久久久久 | 长篇高h肉爽文丝袜 | 国产伦理吴梦梦伦理 | 亚洲不卡视频在线 | 亚欧美日韩 | 污黄视频在线观看 |