c#之装饰者模式
裝飾者模式
1.概述:
??????????????? 動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更加的靈活。?????
2.原理:
??????????????? 增加一個修飾的類來包裹原來的類,包裹的方式一般是通過將原來的對象作為修飾類的構造函數的參數。裝飾類實現新的功能,但是,不需要用到新功能的地方,它可以直接調用原來的類中的方法,修飾類必須和原來的類有相同的接口。??????
3.模式中的角色
3.1:抽象構建(Component):定義一個抽象的接口,用以給這些對象動態的添加職責。
3.2:具體構建(ConcreteComponent):定義一個具體的對象,也可以給這個對象添加一些職責。
3.3:裝飾類(Decorator):裝飾抽象類,繼承了Component,從外類來擴展Component類的功能。
3.4:具體裝飾者(ConcretorDecorator):負責給構造對象添加職責。
4.模式解讀:
5.應用實例的分析:
問題:裝備大兵,無任何的裝備時(核心功能)可以使用拳打腳踢,裝備了步槍,可以使用步槍來進行射擊,裝備了重機槍,可以使用重機槍來進行射擊,裝備了火箭筒,可以使用火箭筒進行防空。
5.1裝備類的定義:
?
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 裝備類 相當于Component/// </summary>public abstract class Equipment{public abstract void Attack();} }?
5.2:定義一個具體的對象,并且給對象添加一些職責:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 裝飾模式 {/// <summary>/// 定義一個具體的對象,并且給對象添加一些職責。/// </summary>class Soldier : Equipment{/// <summary>/// 沒有任何武器裝備下的核心的功能/// </summary>public override void Attack(){Console.WriteLine("用拳腳進行攻擊");}} }5.3:定義一個抽象的裝備裝飾類:
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>/// 增加裝備 使用該方法來動態的給士兵增加裝備/// </summary>/// <param name="equipment">組件的設置</param>public void SetComponent(Equipment equipment){this.Equipment = equipment;}/// <summary>/// 如果有裝備 就用裝備進行攻擊/// </summary>public override void Attack(){if (Equipment != null){Equipment.Attack();}}} }5.4:各個子類的添加:
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>/// 機槍/// </summary>public class MachineGunEquipment : 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>/// 火箭炮射擊/// </summary>public class RocketGunEquipment : EquipDecorator{public override void Attack(){base.Attack();Console.WriteLine("火箭炮射擊");}} }5.5:客戶端代碼的調用:
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);//攻擊 除了拳腳功夫之外 新兵還可以使用步槍 機槍 火箭炮 最終執行的是rocketGunEquipment.Attcck(); rocketGunEquipment.Attack();Console.ReadKey();}} }5.6:截圖如下:
6:裝飾模式的總結
總結:裝飾模式是為已有功能動態的添加更多功能的一種方式。
當系統需要新的功能的時候,是向舊的類中添加新的代碼,這些新的代碼通常裝飾了原來類的核心的職責或者主要的功能。但是這種做法的問題在于:他們在主類中加入了新的字段、新的方法或者新的邏輯之后,從而增加了主類的復雜性。而這些新加入的東西僅僅是為了滿足一些特定的情況下才會執行的特殊的行為的需要。而裝飾模式卻提供了一個非常好的解決方案。它把每個要裝飾的功能放在單獨的類中,并讓這個類包裝它所要修飾的對象,因此當執行特殊的行為時,客戶代碼就可以在運行時根據需要有選擇的、按順序的使用裝飾功能來進行包裝對象了。
那么裝飾模式的優點是:把類中的裝飾功能從類中搬移出去,這樣就可以簡化原來的類。
所以這樣做的最大的好處就是有效的把類的核心的職責和裝飾功能區分開來,而且可以去除相關類中的重復的代碼。
?
轉載于:https://www.cnblogs.com/MoRanQianXiao/p/7747134.html
總結
- 上一篇: 18秋学期《计算机网络》在线作业,18秋
- 下一篇: c#开发-基础知识及有用技巧(一)