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

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

生活随笔

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

C#

c#之装饰者模式

發(fā)布時(shí)間:2023/12/9 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#之装饰者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

裝飾者模式

1.概述:

??????????????? 動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),就增加功能來(lái)說(shuō),裝飾模式比生成子類更加的靈活。?????

2.原理:

??????????????? 增加一個(gè)修飾的類來(lái)包裹原來(lái)的類,包裹的方式一般是通過(guò)將原來(lái)的對(duì)象作為修飾類的構(gòu)造函數(shù)的參數(shù)。裝飾類實(shí)現(xiàn)新的功能,但是,不需要用到新功能的地方,它可以直接調(diào)用原來(lái)的類中的方法,修飾類必須和原來(lái)的類有相同的接口。??????

3.模式中的角色

3.1:抽象構(gòu)建(Component):定義一個(gè)抽象的接口,用以給這些對(duì)象動(dòng)態(tài)的添加職責(zé)。

3.2:具體構(gòu)建(ConcreteComponent):定義一個(gè)具體的對(duì)象,也可以給這個(gè)對(duì)象添加一些職責(zé)。

3.3:裝飾類(Decorator):裝飾抽象類,繼承了Component,從外類來(lái)擴(kuò)展Component類的功能。

3.4:具體裝飾者(ConcretorDecorator):負(fù)責(zé)給構(gòu)造對(duì)象添加職責(zé)。

4.模式解讀:

5.應(yīng)用實(shí)例的分析:

問(wèn)題:裝備大兵,無(wú)任何的裝備時(shí)(核心功能)可以使用拳打腳踢,裝備了步槍,可以使用步槍來(lái)進(jìn)行射擊,裝備了重機(jī)槍,可以使用重機(jī)槍來(lái)進(jìn)行射擊,裝備了火箭筒,可以使用火箭筒進(jìn)行防空。

5.1裝備類的定義:

?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 裝備類 相當(dāng)于Component/// </summary>public abstract class Equipment{public abstract void Attack();} }

?

5.2:定義一個(gè)具體的對(duì)象,并且給對(duì)象添加一些職責(zé):

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 定義一個(gè)具體的對(duì)象,并且給對(duì)象添加一些職責(zé)。/// </summary>class Soldier : Equipment{/// <summary>/// 沒(méi)有任何武器裝備下的核心的功能/// </summary>public override void Attack(){Console.WriteLine("用拳腳進(jìn)行攻擊");}} }

5.3:定義一個(gè)抽象的裝備裝飾類:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 裝備裝飾類(抽象類)/// </summary>public abstract class EquipDecorator : Equipment{protected Equipment Equipment;/// <summary>/// 增加裝備 使用該方法來(lái)動(dòng)態(tài)的給士兵增加裝備/// </summary>/// <param name="equipment">組件的設(shè)置</param>public void SetComponent(Equipment equipment){this.Equipment = equipment;}/// <summary>/// 如果有裝備 就用裝備進(jìn)行攻擊/// </summary>public override void Attack(){if (Equipment != null){Equipment.Attack();}}} }

5.4:各個(gè)子類的添加:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 步槍/// </summary>public class RifleEquipment : EquipDecorator{public override void Attack(){base.Attack();Console.WriteLine("步槍射擊");}} } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 機(jī)槍/// </summary>public class MachineGunEquipment : EquipDecorator{public override void Attack(){base.Attack();Console.WriteLine("機(jī)槍掃射");}} } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 火箭炮射擊/// </summary>public class RocketGunEquipment : EquipDecorator{public override void Attack(){base.Attack();Console.WriteLine("火箭炮射擊");}} }

5.5:客戶端代碼的調(diào)用:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {class Program{static void Main(string[] args){//定義新兵Soldier soldier = new Soldier();//三種裝備RifleEquipment rifleEquipment = new RifleEquipment();MachineGunEquipment machineGunEquipment = new MachineGunEquipment();RocketGunEquipment rocketGunEquipment = new RocketGunEquipment();//將三種裝備全部交給新兵 rifleEquipment.SetComponent(soldier);machineGunEquipment.SetComponent(rifleEquipment);rocketGunEquipment.SetComponent(machineGunEquipment);//攻擊 除了拳腳功夫之外 新兵還可以使用步槍 機(jī)槍 火箭炮 最終執(zhí)行的是rocketGunEquipment.Attcck(); rocketGunEquipment.Attack();Console.ReadKey();}} }

5.6:截圖如下:

6:裝飾模式的總結(jié)

總結(jié):裝飾模式是為已有功能動(dòng)態(tài)的添加更多功能的一種方式。

當(dāng)系統(tǒng)需要新的功能的時(shí)候,是向舊的類中添加新的代碼,這些新的代碼通常裝飾了原來(lái)類的核心的職責(zé)或者主要的功能。但是這種做法的問(wèn)題在于:他們?cè)谥黝愔屑尤肓诵碌淖侄?、新的方法或者新的邏輯之?#xff0c;從而增加了主類的復(fù)雜性。而這些新加入的東西僅僅是為了滿足一些特定的情況下才會(huì)執(zhí)行的特殊的行為的需要。而裝飾模式卻提供了一個(gè)非常好的解決方案。它把每個(gè)要裝飾的功能放在單獨(dú)的類中,并讓這個(gè)類包裝它所要修飾的對(duì)象,因此當(dāng)執(zhí)行特殊的行為時(shí),客戶代碼就可以在運(yùn)行時(shí)根據(jù)需要有選擇的、按順序的使用裝飾功能來(lái)進(jìn)行包裝對(duì)象了。

那么裝飾模式的優(yōu)點(diǎn)是:把類中的裝飾功能從類中搬移出去,這樣就可以簡(jiǎn)化原來(lái)的類。

所以這樣做的最大的好處就是有效的把類的核心的職責(zé)和裝飾功能區(qū)分開(kāi)來(lái),而且可以去除相關(guān)類中的重復(fù)的代碼。

?

轉(zhuǎn)載于:https://www.cnblogs.com/MoRanQianXiao/p/7747134.html

總結(jié)

以上是生活随笔為你收集整理的c#之装饰者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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