战略模式V / S装饰模式

我刚刚遇到两种模式。

  1. 战略模式

  2. 装饰

策略模式: –

策略模式提供了几种可用于执行特定操作或任务的algorithm。

装饰模式: –

装饰模式为组件添加了一些function。

事实上,我发现策略模式和装饰模式也可以互换使用。

这里是链接: – 何时和如何战略模式可以应用而不是装饰者模式?

Strategy Pattern和Decorator Pattern有什么区别?

什么时候应该使用战略模式,何时应该使用装饰模式?

用同一个例子来解释两者的区别。

策略模式允许你改变运行时使用的东西的实现。

装饰器模式允许您在运行时增加(或添加)具有附加function的现有function。

关键的区别在于变化增加

在你链接到的其中一个问题中也指出,在战略模式中,消费者意识到存在不同的select,而装饰者模式中消费者不会意识到附加function。

举个例子,假设你正在编写一些东西来对一组元素进行sorting。 所以你写一个接口ISortingStrategy ,然后你可以实现几个不同的sorting策略BubbleSortStrategyBubbleSortStrategyRadixSortStrategy ,然后你的应用程序根据现有列表的一些标准select最合适的策略来sorting列表。 因此,例如,如果列表中less于10个项目,我们将使用RadixSortStrategy ,如果自上一次添加的项目less于10个,我们将使用BubbleSortStrategy否则我们将使用QuickSortStrategy

我们正在改变运行时sorting的types(根据一些额外的信息来更高效),这就是战略模式。

现在想象一下,有人要求我们提供一个logging,说明每种sortingalgorithm用于实际sorting的次数以及对pipe理用户的sorting限制。 我们可以通过创build一个装饰器来增加任何 ISortingStrategy的这些function。 我们可以创build一个装饰器,logging它用于sorting的东西和装饰sorting策略的types。 我们可以添加另一个装饰器,在调用装饰sorting策略之前检查当前用户是否是pipe理员。

在这里,我们使用装饰器添加任何sorting策略的新function,但是不会交换核心sortingfunction(我们使用不同的策略来改变它)

以下是装饰器可能的外观示例:

 public interface ISortingStrategy { void Sort(IList<int> listToSort); } public class LoggingDecorator : ISortingStrategy { private ISortingStrategy decorated; public LoggingDecorator(ISortingStrategy decorated) { this.decorated=decorated; } void Sort(IList<int> listToSort) { Log("sorting using the strategy: " + decorated.ToString(); decorated.Sort(listToSort); } } public class AuthorisingDecorator : ISortingStrategy { private ISortingStrategy decorated; public AuthorisingDecorator(ISortingStrategy decorated) { this.decorated=decorated; } void Sort(IList<int> listToSort) { if (CurrentUserIsAdministrator()) { decorated.Sort(listToSort); } else { throw new UserNotAuthorizedException("Only administrators are allowed to sort"); } } } 

Strategy_pattern

  1. 定义一个algorithm族,
  2. 封装每个algorithm,并
  3. 使algorithm在该系列内可互换。

在运行时必须dynamic更改algorithm时,请使用策略模式。

装饰

Decorator模式在运行时dynamic地改变对象的function,而不会影响对象的现有function。

何时使用:

  1. dynamic添加其他function/职责
  2. dynamic删除function/职责
  3. 避免过多的子分类来增加额外的责任。

缺点:

  1. 过度使用开放式封闭原则(Open for extension and Closed for modification)。 在代码最不可能更改的地方谨慎使用此function。
  2. 太多的小类,会增加维护的开销。

主要区别:

策略可以让你改变对象的胆量。 装饰者让你改变皮肤。

几个更有用的职位:

何时使用装饰模式?

战略格局的现实世界范例

战略由源头

策略是模式用来“封装什么变化”。 它允许您定义在运行时可以互换的algorithm。 例如(从Head First Design Patterns中得到的例子):

假设你有一个鸭子模拟器。 你想让你的鸭子飞起来。 你可以使用inheritance来做到这一点,但它很快就会变得混乱。 有些鸭子不能飞(如橡皮鸭)。 做到这一点的方法是把什么变化,即飞行行为封装到自己的类,实现IFlybehaviour例如。 然后,您可以使用组合而不是inheritance,并将IFlybehaviour注入到您的鸭子对象中。 你也可以有一个方法设置这个飞行行为,以便在运行时改变飞行行为。 这基本上是战略模式。

装饰器模式用于在运行时向对象添加function。 它允许你在对象中包装对象。 装饰者必须具有与他们装饰的对象相同的超types。 这允许你在“最外层的包装器”上调用一个方法,然后你可以通过装饰器的层次来调用这个方法。 这基本上比子类更灵活。

至于你select哪一个取决于你想解决的问题。 你想有一个在运行时可互换的algorthims系列,或者你想在运行时dynamic地添加更多的function到一个对象吗?

“头先devise模式”这本书相当好地解释了这一点(可能比我好得多)海事组织,所以它是值得一读,如果你有机会。

祝你好运。

归结起来就是:使用策略来select一个核心function。 使用装饰者添加额外的function。 策略是我们正在做的蛋糕,装饰是所有漂亮的装饰,我们添加到它。