装饰者模式 (Decorator Pattern)-结构型模式第一篇

  1. 《设计模式》系列序——写给未来的自己
  2. 工厂方法模式(Factory Method)-创建型模式第一篇
  3. 抽象工厂模式(Abstract Factory Pattern)-创建型模式第二篇
  4. 单例模式(Singleton Pattern)-创建型模式第三篇
  5. 建造者模式(Builder Pattern)-创建型模式第四篇
  6. 原型模式(Prototype Pattern)-创建型模式第五篇
  7. 装饰者模式 (Decorator Pattern)-结构型模式第一篇
  8. 组合模式 (Composite Pattern)-结构型模式第二篇
  9. 适配器模式 (Adapter Pattern)-结构型模式第三篇
  10. 代理模式 (Proxy Pattern)-结构型模式第四篇
  11. 桥接模式 (Bridge Pattern)-结构型模式第五篇

本篇是结构型模式(Structural patterns)的第一篇,之所以选择Decorator模式第一个出场,是由于抓揪随机的结果。Decorator模式能够为行为带来灵活的组合,减少子类的数量,希望文章能够给大家带来一点帮助。

定义:

Decorator模式,能够将行为动态地添加到一个类型实例,而不会影响其它的实例。

解决的问题:

  1. 如何在运行时给一个对象添加新的行为
  2. 如何减少子类的数量
    1. 我们知道通过新建一个子类,也能够为类型添加新的行为,但是它存在一个明显的缺陷:随着新行为数目的不断增加,需要增加更多数目的子类,并且行为之间无法组合使用

怎么去解决:

  1. 通过定义一个接口代表原始对象本身,如IComponent
  2. 通过定义一个接口IDecorator,它继承自IComponent,同时通过组合的方式它拥有IComponent
  3. 对于IDecorator的任何请求,都会被重定向到IComponent,并且在重定向前后我们有能力添加新的行为

UML:


实例:

using System;

namespace DecoratorPattern
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Meal meal = new Dinner();
            IMealDecorator mealDecorator = new RiceMealDecorator(new FruitMealDecorator(meal));
            Console.WriteLine(mealDecorator.Eat());
            Console.ReadKey();
        }
    }

    public interface Meal
    {
        string Eat();
    }

    public class Dinner : Meal
    {
        public string Eat()
        {
            return "Had dinner!";
        }
    }

    public interface IMealDecorator : Meal
    {
        Meal Meal { get; set; }
    }

    public class FruitMealDecorator : IMealDecorator
    {
        public FruitMealDecorator(Meal meal)
        {
            Meal = meal;
        }

        public Meal Meal { get; set; }

        public string Eat()
        {
            return $"Ate a fruit!{Environment.NewLine}{Meal.Eat()}";
        }
    }

    public class RiceMealDecorator : IMealDecorator
    {
        public RiceMealDecorator(Meal meal)
        {
            Meal = meal;
        }

        public Meal Meal { get; set; }

        public string Eat()
        {
            return $"Ate a bowl of rice!{Environment.NewLine}{Meal.Eat()}";
        }
    }
}

注释:

输出:

Leave a Reply

Your email address will not be published. Required fields are marked *