关于C# 设计模式 Decorator 装饰器模式

关于C# 设计模式 Decorator 装饰器模式

using System;
using System.Collections.Generic;
using System.Text;

///Decorator(装饰器)模式 通过对已经存在的某些类进行装饰,以此来扩展一些功能。
///add by jzh 2007-04-24
namespace DesignPattern
{
    /// <summary>
    /// Component(抽象构件)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
    /// </summary>
    abstract class ComponentBus
    {
        public abstract void Draw();
    }

    /// <summary>
    /// Concrete Component(具体构件)角色:定义一个将要接收附加责任的类。
    /// </summary>
    class ConcreteComponent : ComponentBus
    {
        private string strName;

        public ConcreteComponent(string name)
        {
            strName = name;
        }

        public override void Draw()
        {
            Console.WriteLine("ConcreteComponent - {0}", strName);
        }
    }

    /// <summary>
    /// Decorator(装饰)角色:持有一个Component对象的实例,并定义一个与抽象构件接口一致的接口。
    /// </summary>
    abstract class Decorator : ComponentBus
    {
        protected ComponentBus ActualComponent;

        public void SetComponent(ComponentBus c)
        {
            ActualComponent = c;
        }
        public override void Draw()
        {
            if (ActualComponent != null)
                ActualComponent.Draw();
        }
    }

    /// <summary>
    /// Concrete Decorator(具体装饰)角色:负责给构件对象“贴上”附加的责任。
    /// </summary>
    class ConcreteDecorator : Decorator
    {
        private string strDecoratorName;
        public ConcreteDecorator(string str)
        {
            strDecoratorName = str;
        }
        public override void Draw()
        {
            CustomDecoration();
            base.Draw();
        }
        void CustomDecoration()
        {
            Console.WriteLine("In ConcreteDecorator: decoration goes here");
            Console.WriteLine("{0}", strDecoratorName);
        }
    }

    public class Client
    {
        ComponentBus Setup()
        {
            ConcreteComponent c = new ConcreteComponent("This is the real component");

            ConcreteDecorator d = new ConcreteDecorator("This is a decorator for the component");

            d.SetComponent(c);

            return d;
        }

        public static void Main(string[] args)
        {
            Client client = new Client();
            ComponentBus c = client.Setup();

            c.Draw();

            Console.ReadLine();
        }
    }
}

 

发表回复

您的电子邮箱地址不会被公开。