C# 設計形式系列教程-裝潢形式。本站提示廣大學習愛好者:(C# 設計形式系列教程-裝潢形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 設計形式系列教程-裝潢形式正文
1. 概述
靜態地給一個對象添加一些額定的職責,就增長功效來講,裝潢形式比生成子類更靈巧。
道理:增長一個潤飾類包裹本來的類,包裹的方法普通是經由過程在將本來的對象作為潤飾類的結構函數的參數。裝潢類完成新的功效,然則,在不須要用到新功效的處所,它可以直接挪用本來的類中的辦法。潤飾類必需和本來的類有雷同的接口。
2. 形式中的腳色
2.1 籠統構建(Component):界說一個籠統接口,用以給這些對象靜態地添加職責。
2.2 詳細構建(ConcreteComponent):界說一個詳細的對象,也能夠給這個對象添加一些職責。
2.3 裝潢類(Decorator): 裝潢籠統類,繼續了Component,從外類來擴大Component類的功效。
2.4 詳細裝潢者(ConcretorDecorator):擔任給構建對象添加職責。
3. 形式解讀
3.1 裝潢形式的普通化類圖
3.2 裝潢形式的普通化代碼
/// <summary> /// 界說一個對象接口,可以給這些對象靜態地添加職責 /// </summary> public abstract class Component { public abstract void Opration(); } /// <summary> /// 詳細對象 /// </summary> public class ConcreteComponent:Component { public override void Opration() { // 詳細對象的操作 } } /// <summary> /// 籠統的裝潢類,它不克不及初始化對象。 /// </summary> public abstract class Decorator:Component { protected Component component; /// <summary> /// 設置Component /// </summary> /// <param name="component"></param> public void SetComponent(Component component) { this.component = component; } /// <summary> /// 重寫Operation,現實履行的是Component的Operation。 /// </summary> public override void Opration() { if (component != null) { component.Opration(); } } } public class ConcreteDecoratorA : Decorator { private void SpecialOpration() { // 本類獨有的功效 } public override void Opration() { //起首運轉原Component的Operation(),在履行本類的功效,相當於對原Component停止了裝潢 base.Opration(); this.SpecialOpration(); } } public class ConcreteDecoratorB : Decorator { private void SpecialOprationA() { // 本類獨有的功效 A } private void SpecialOprationB() { // 本類獨有的功效 B } public override void Opration() { //起首運轉原Component的Operation(),在履行本類的功效,相當於對原Component停止了裝潢 base.Opration(); this.SpecialOprationA(); this.SpecialOprationB(); } }
4. 形式總結
4.1 長處
4.1.1 每一個裝潢對象只關懷本身的功效,不須要關懷若何被添加到對象鏈傍邊。它是由Decorator的SetComponent辦法來完成的,因此它們的職責是單一的。
4.1.2 類的焦點職責與靜態添加的職責是分別的。假如再向主類中添加新的功效,一是違背了開放關閉准繩,二是增長了主類的龐雜度。
4.1.3 比靜態繼續更靈巧 與對象的靜態繼續比擬,Decorator形式供給了加倍靈巧的向對象添加職責的方法,可使用添加和分別的辦法,用裝潢在運轉時辰增長和刪除職責.
4.2 缺陷
4.2.1 發生很多小對象,采取Decorator形式停止體系設計常常會發生很多看上去相似的小對象,這些對象僅僅在他們互相銜接的方法上有所分歧。
4.3 實用場景
4.3.1 當須要為已有功效靜態地添加更多功效時。
4.3.2 類的焦點功效無需轉變,只是須要添加新的功效時。
5. 運用實例:設備年夜兵!無任何設備時(焦點功效)可以用拳腳搏擊;設備了步槍,可以正常射擊;設備了重機槍,可以掃射;設備了火箭筒,可以防空。
5.1 類圖設計
5.2 代碼完成
/// <summary> /// 設備類,相當於Component /// </summary> public abstract class Equipment { public abstract void Attack(); } /// <summary> /// 兵士類,繼續自Equipment /// </summary> public class Soldier : Equipment { public Soldier() { // 結構函數 } /// <summary> /// 沒有任何兵器設備下的焦點功效 /// </summary> public override void Attack() { Console.WriteLine("用拳腳進擊!"); } } 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(); } } } /// <summary> /// 步槍 /// </summary> public class RifleEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("步槍射擊,啪!"); } } /// <summary> /// 機槍 /// </summary> public class MachineGunEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("機槍掃射,突突突!"); } } /// <summary> /// 火箭筒 /// </summary> public class RocketGunEquipment : EquipDecorator { public override void Attack() { base.Attack(); Console.WriteLine("火箭炮射擊,唰......!"); } }
5.3 客戶端挪用
class Program { static void Main(string[] args) { // 界說新兵 Soldier soldier = new Soldier(); // 三種設備 RifleEquipment rifle = new RifleEquipment(); MachineGunEquipment machineGun = new MachineGunEquipment(); RocketGunEquipment rocketGun = new RocketGunEquipment(); // 將三種設備全體交給新兵 rifle.SetComponent(soldier); machineGun.SetComponent(rifle); rocketGun.SetComponent(machineGun); // 進擊,除拳腳工夫外,新兵還可使用步槍,機槍,火箭炮.終究履行的是rocketGun.Attack(). rocketGun.Attack(); Console.Read(); } }
5.4 運轉成果
用拳腳進擊!
步槍射擊,啪!
機槍掃射,突突突!
火箭炮射擊,唰......!
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。