c#之装饰者模式
裝飾者模式
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é)
- 上一篇: 18秋学期《计算机网络》在线作业,18秋
- 下一篇: c#开发-基础知识及有用技巧(一)