您现在的位置是:主页>设计模式>C# 设计模式(3)--装饰模式 网站首页

C# 设计模式(3)--装饰模式

一,引言

这个系列是本人对设计模式的一些看法,希望能让对设计模式有兴趣的朋友,以此入门,写的不当之处欢迎指出。转载的朋友请留下原文链接。下面为大家介绍一种设计模式——装饰模式.

二,定义

装饰模式是可以动态地给一个对象增加一些额外的职责。就添加功能来说装饰模式有时候比生成子类更加灵活。可以说是继承关系的一种替代方案。

Component定义了一个接口,可以利用Decorator为实现了这个接口的对象动态地增加职责

ConcreteComponent定义了一个实现了Component接口的对象

Decorator是抽象装饰者类,继承自Component接口,并包含有一个实现了Component接口的对象

ConcreteDecorator是具体装饰者类,用于为ConcreteComponent增加职责

在以上结构中,Component和Decorator可以情况省略。

以上这一小节来自:http://www.cnblogs.com/saville/archive/2011/07/19/2110830.html

三,具体实例

namespace DecoratorDemo
{
    /// 
    /// 装饰对象
    /// 
    class Person
    {
        public Person() { }
        private string name;
        public Person(string name)
        {
            this.name = name;
        }
        public virtual void Print() 
        {
            Console.WriteLine("{0}的装扮",name);
        }
    }
}
namespace DecoratorDemo
{
    /// 
    /// 具体对象类,也可以给这个对象添加一些职责
    /// 
    class Scarf:Person
    {
        /// 
        /// 重写基类方法
        /// 
        public override void Print()
        {
            Console.WriteLine("围巾");
        }
    }
}
namespace DecoratorDemo
{
    /// 
    /// 装饰抽象类
    /// 
    class Trappings:Person
    {
        protected Person component;
        public void Decorate(Person component) 
        {
            this.component = component;
        }
        public override void Print()
        {
            if (component != null)
            {
                component.Print();
            } 
        }
    }
}
namespace DecoratorDemo
{
    /// 
    /// 手套,具体装饰类
    /// 
    class Gloves : Trappings
    {
        public override void Print()
        {
            base.Print();
            //扩展新的行为
            newMethod();
        }
        /// 
        /// 新的行为方法
        /// 
        public void newMethod()
        {
            Console.WriteLine("手套");
        }
    }
}
namespace DecoratorDemo
{
    /// 
    /// 手镯,具体装饰类
    /// 
    class Bracelet : Trappings
    {
        public override void Print()
        {
            base.Print();
            //扩展新的行为
            newMethod();
        }
        /// 
        /// 新的行为方法
        /// 
        public void newMethod()
        {
            Console.WriteLine("手镯");
        }
    }
}
namespace DecoratorDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Person mc = new Person("mcalvin");
            Scarf sf = new Scarf();
            Trappings tp = new Trappings();
            Bracelet bl = new Bracelet();
            Gloves gv = new Gloves();
            mc.Print();
            bl.Decorate(sf);//装饰对象,装饰扩展对象
            gv.Decorate(bl);//装饰对象,装饰扩展对象
            gv.Print();
        }
    } 
}

四,总结

1:在扩展的灵活性上面有时候比继承来的好。2:一定程度上添加了程序的复杂度。3:通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

当然不止我说到的那些,想学好设计模式的话还是要买本相关的书籍,推荐下一本书《大话设计模式》C#版的写的很生动,喜欢请转载。

本例实例下载:装饰模式源码

Top