战略模式V / S装饰模式
我刚刚遇到两种模式。
-
战略模式
-
装饰
策略模式: –
策略模式提供了几种可用于执行特定操作或任务的algorithm。
装饰模式: –
装饰模式为组件添加了一些function。
事实上,我发现策略模式和装饰模式也可以互换使用。
这里是链接: – 何时和如何战略模式可以应用而不是装饰者模式?
Strategy Pattern和Decorator Pattern有什么区别?
什么时候应该使用战略模式,何时应该使用装饰模式?
用同一个例子来解释两者的区别。
策略模式允许你改变运行时使用的东西的实现。
装饰器模式允许您在运行时增加(或添加)具有附加function的现有function。
关键的区别在于变化与增加
在你链接到的其中一个问题中也指出,在战略模式中,消费者意识到存在不同的select,而装饰者模式中消费者不会意识到附加function。
举个例子,假设你正在编写一些东西来对一组元素进行sorting。 所以你写一个接口ISortingStrategy
,然后你可以实现几个不同的sorting策略BubbleSortStrategy
, BubbleSortStrategy
, RadixSortStrategy
,然后你的应用程序根据现有列表的一些标准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
- 定义一个algorithm族,
- 封装每个algorithm,并
- 使algorithm在该系列内可互换。
在运行时必须dynamic更改algorithm时,请使用策略模式。
装饰
Decorator模式在运行时dynamic地改变对象的function,而不会影响对象的现有function。
何时使用:
- dynamic添加其他function/职责
- dynamic删除function/职责
- 避免过多的子分类来增加额外的责任。
缺点:
- 过度使用开放式封闭原则(Open for extension and Closed for modification)。 在代码最不可能更改的地方谨慎使用此function。
- 太多的小类,会增加维护的开销。
主要区别:
策略可以让你改变对象的胆量。 装饰者让你改变皮肤。
几个更有用的职位:
何时使用装饰模式?
战略格局的现实世界范例
战略由源头
策略是模式用来“封装什么变化”。 它允许您定义在运行时可以互换的algorithm。 例如(从Head First Design Patterns中得到的例子):
假设你有一个鸭子模拟器。 你想让你的鸭子飞起来。 你可以使用inheritance来做到这一点,但它很快就会变得混乱。 有些鸭子不能飞(如橡皮鸭)。 做到这一点的方法是把什么变化,即飞行行为封装到自己的类,实现IFlybehaviour例如。 然后,您可以使用组合而不是inheritance,并将IFlybehaviour注入到您的鸭子对象中。 你也可以有一个方法设置这个飞行行为,以便在运行时改变飞行行为。 这基本上是战略模式。
装饰器模式用于在运行时向对象添加function。 它允许你在对象中包装对象。 装饰者必须具有与他们装饰的对象相同的超types。 这允许你在“最外层的包装器”上调用一个方法,然后你可以通过装饰器的层次来调用这个方法。 这基本上比子类更灵活。
至于你select哪一个取决于你想解决的问题。 你想有一个在运行时可互换的algorthims系列,或者你想在运行时dynamic地添加更多的function到一个对象吗?
“头先devise模式”这本书相当好地解释了这一点(可能比我好得多)海事组织,所以它是值得一读,如果你有机会。
祝你好运。
归结起来就是:使用策略来select一个核心function。 使用装饰者添加额外的function。 策略是我们正在做的蛋糕,装饰是所有漂亮的装饰,我们添加到它。