白话说设计模式之装饰者模式_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 白话说设计模式之装饰者模式

白话说设计模式之装饰者模式

 2013/9/15 2:46:19  隨風.NET  博客园  我要评论(0)
  • 摘要:设计模式分为三大类型,一创建型,二结构型,三行为型.而装饰者(decorator)模式是属于结构型的一种.此模式主要的适应情况是:需要多种情况组合出现时.也就是调用一个方法的时候,可能是ABC三个中的一种,也可能是他们的组合.AB,AC,BC,AC等等.如果听到类似的情形,需要组合多种情况出现的时候,就需要考虑到使用此种模式了.这个模式顾名思义:就是装饰,一个本体可以有多种装饰物,多个装饰物用来修饰一个本体.下面我们来举个小例子来加深下了解:大致情况是:一家人在吃饭,小明的碗里只有白米饭
  • 标签:模式 设计 设计模式

设计模式分为三大类型,一创建型,二结构型,三行为型.

而装饰者(decorator)模式是属于结构型的一种.

此模式主要的适应情况是:需要多种情况组合出现时.

也就是调用一个方法的时候,可能是ABC三个中的一种,也可能是他们的组合.

AB,AC,BC,AC等等.

 

如果听到类似的情形,需要组合多种情况出现的时候,就需要考虑到使用此种模式了.

这个模式顾名思义:就是装饰,一个本体可以有多种装饰物,多个装饰物用来修饰一个本体.

下面我们来举个小例子来加深下了解:

大致情况是:一家人在吃饭,小明的碗里只有白米饭,小明没有夹菜一直在吃白饭,爷爷看不下去了,

就给他夹了一块肉,妈妈也看不下去了,就给他夹了一块鱼,这个时候爸爸也看不下去了,光吃荤菜不行,

要荤素搭配呀,于是就给他夹了一根青菜.

在这个案例里,小明是一直没夹菜的,只顾自己吃饭.给他夹菜的是爸爸妈妈和爷爷.而这个夹菜的组合是

不固定的,可能都给他夹,也可能只有任何几个人夹菜,这样就动态给他增加了功能.

相关代码如下:

 

class="brush:csharp;gutter:false;"> public interface IEat
    {
        void Eat();
    }

 public class XiaoMing:IEat
    {
        public void Eat()
        {
            Console.WriteLine("小明只吃白米饭");
        }
    }

 public class EatDecorator:IEat
    {
        private IEat _eat;

        public EatDecorator(IEat eat)
        {
            this._eat = eat;
        }

        public virtual void Eat()
        {
            if (_eat != null)
            {
                _eat.Eat();
            }
        }
    }

public class MotherDecorator : EatDecorator
    {
        public MotherDecorator(IEat eat)
            : base(eat)
        { }

        public override void Eat()
        {
            Console.WriteLine("妈妈给夹了一块鱼");
            base.Eat();
        }
    }

调用代码如下:

        static void Main(string[] args)
        {
            IEat xiaoming = new XiaoMing();

            IEat mom = new MotherDecorator(xiaoming);
            IEat dad = new FatherDecorator(mom);
            IEat grandpa = new GrandfatherDecorator(dad);
            grandpa.Eat();
        }

 

运行结果如下:

此模式的精要在于:

  1. 可以任意组合多种的情况,动态给类增加某种行为.
  2. 装饰者与被装饰者都需要有同样的继承体系,既继承自同一接口.(说白了,也就是让装饰工和他的子类可以接受被装饰者,可以将被装饰者的对象进行传递)
发表评论
用户名: 匿名