本篇是结构型模式(Structural patterns)的第一篇,之所以选择Decorator模式第一个出场,是由于抓揪随机的结果。Decorator模式能够为行为带来灵活的组合,减少子类的数量,希望文章能够给大家带来一点帮助。
定义:
Decorator模式,能够将行为动态地添加到一个类型实例,而不会影响其它的实例。
解决的问题:
- 如何在运行时给一个对象添加新的行为
- 如何减少子类的数量
- 我们知道通过新建一个子类,也能够为类型添加新的行为,但是它存在一个明显的缺陷:随着新行为数目的不断增加,需要增加更多数目的子类,并且行为之间无法组合使用
怎么去解决:
- 通过定义一个接口代表原始对象本身,如IComponent
- 通过定义一个接口IDecorator,它继承自IComponent,同时通过组合的方式它拥有IComponent
- 对于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()}"; } } }