9.裝飾模式

原理:

裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式, 它是作爲現有的類的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

意圖:

動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。

主要解決:

一般的,我們爲了擴展一個類經常使用繼承方式實現,由於繼承爲類引入靜態特徵,並且隨着擴展功能的增多,子類會很膨脹。

注意:

如果只有一個ConcreteComponent類,而沒有抽象的Component類,那麼Decorator類可以是ConcreteComponent的一個子類 同理,如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合併成一個類

應用實例:

1、孫悟空有 72 變,當他變成"廟宇"後,他的根本還是一隻猴子,但是他又有了廟宇的功能。 2、不論一幅畫有沒有畫框都可以掛在牆上,但是通常都是有畫框的,並且實際上是畫框被掛在牆上。在掛在牆上之前,畫可以被蒙上玻璃,裝到框子裏;這時畫、玻璃和畫框形成了一個物體。

代碼

Prpgram.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 裝飾模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteComponent c = new ConcreteComponent();
            //裝飾過程
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();

            d1.SetComponent(c);
            d2.SetComponent(d1);
            d2.Operation();

            Console.ReadKey();
        }
    }
}

Decorator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 裝飾模式
{
    //Component類
    abstract class Component
    {
        public abstract void Operation();
    }

    //ConcreteComponent
    class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.Write("具體對象的操作 ");
        }
    }
    //Decorator 類
    abstract class Decorator : Component
    {
        protected Component component;
        public void SetComponent(Component component)
        {
            this.component = component;
        }
        public override void Operation()
        {
            if (component != null) {
                component.Operation();
            }
        }
    }
    //ConcreteDecoratorA類
    class ConcreteDecoratorA : Decorator
    {
        private string addedState;//本類的獨有功能,以區別於ConcreteDecoratorB類
        public override void Operation()
        {
            //首先執行本類的功能,如addedState,再運行原Component的Operation(),相當於對原Component進行了裝飾
            addedState = "New State";
            Console.Write("具體裝飾對象A的操作 ");
            base.Operation();
            
        }
    }
    //ConcreteDecoratorB類
    class ConcreteDecoratorB : Decorator
    {
        private void AddedBehavior()//本類的獨有功能,以區別於ConcreteDecoratorA類
        {

        }
        public override void Operation()
        {
            //首先執行本類的功能,AddedBehavior(),再運行原Component的Operation(),相當於對原Component進行了裝飾
            AddedBehavior();
            Console.Write("具體裝飾對象B的操作 ");
            base.Operation();    
        }
    }
}

參考

參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章