http://www.cnblogs.com/zhangronghua/archive/2008/07/16/1244207.html
在什么时候应该使用Strategy Pattern呢?毕竟我们学了就是要用的,这里让我们来看一个吕震宇所列的几个情形:
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2. 一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
3. 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。
Strategy Pattern的优点和缺点:
同样让我们来看吕震宇所列:
优点有:
1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。
2. 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
缺点有:
1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
四Strategy Pattern和其它模式的比较
1 Strategy Pattern和Template Method的比较:
Strategy Pattern定义了一个算法族,封装了算法的变化,客户可以通过委托模型轻易的使用不同的算法,这降低了依赖,也提高了灵活性,但正像前面提到的,Strategy Pattern会产生很多的策略类,并且要求客户对这些算法类比较熟悉,毕竟应该使用那个类不是Strategy Pattern说了算的,而是由客户根据实际情况决定的。
Template Method(我们会在以后介绍)利用了继承的方法,在基类中定义了算法的框架,并将算法的可变部分声明为可重写的,由具体的子类使用,这样就可以利用同样的框架,完成不同的功能。它的优点是效率高一点,并且比较简单,(这也是我们平常最常用的一个设计模式,虽然我们可能并没有注意),但同时,Template Pattern的依赖性太高,它没有办法让客户在运行时改变行为。
2 Strategy pattern 和State Pattern的比较
Strategy pattern将算法族定义在不同的子类中,由用户根据需要选择,并且Strategy pattern是继承的一种弹性替代方案,通过组合,我们可以提供运行时改变对象行为的方法。
State Pattern是将行为封装在状态对象中,类的行为根据状态的不同而变化,这点对用户是透明的。另外State Pattern是多条件判断的替代方案,我们通过多态来去掉多条件判断这一不好的编程习惯。
分享到:
相关推荐
在本文中,我们将详细介绍如何使用策略模式在SpringBoot项目中实现业务逻辑处理。 策略模式的定义 策略模式是一种行为设计模式,它允许开发者定义一些策略族,分别封装起来,每一个策略中的算法具有一定的独立性,...
3. 算法使用客户不应该知道的数据,可使用策略模式避免暴漏复杂的与算法相关的数据结构。 4. 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。 策略模式的优点包括: 1. 提供了一种...
例如,一个简单的工厂可以负责创建不同策略的对象,然后根据策略模式的原则,在运行时动态地选择和使用这些策略。这样,既保留了简单工厂模式的便捷性,又利用了策略模式的灵活性。 在实际应用中,简单工厂模式常...
然而,策略模式也有一些潜在的缺点: 1. **增加复杂性**:过多的策略类可能会导致系统复杂度增加。 2. **滥用策略模式**:如果每个小的逻辑变化都创建一个策略类,可能导致过度设计。 在进行重构时,需要权衡是否...
在软件设计模式的世界里,"简单工厂模式"、"代理模式"和"策略模式"都是经典的设计模式,它们各自有着独特的应用场景和优缺点。本文将深入解析这三种模式的原理和区别,帮助读者理解它们在实际开发中的运用。 首先,...
- **策略模式优缺点分析** #### 设计模式概述 设计模式是一种在特定情境下针对某个重复出现的问题提出的解决方案。它不仅是一种编程技巧,更是一种思维方式,能够帮助开发者以更加高效、灵活的方式解决软件开发中的...
例如,在处理一些有多种实现方式的功能时,可以使用策略模式;而在处理有固定步骤但部分步骤可变的操作时,模板模式则非常适用。 总之,模板模式和策略模式是Java编程中不可或缺的设计模式,它们帮助我们更好地组织...
3. **实现方式**:策略模式通常使用组合而非继承来实现。上下文持有一个对策略对象的引用,而不是继承策略。这样做的好处是可以动态地改变对象的行为,而无需修改其结构。 4. **优缺点**: - **优点**:增加了系统...
##### 策略模式缺点 虽然策略模式有许多优点,但也存在一些不足之处: 1. **增加对象数量**:每增加一个新的算法就需要新增一个具体的策略类。 2. **增加系统复杂性**:引入了更多的对象和接口,可能会使系统变得...
然而,策略模式也存在一定的缺点,比如增加了系统的复杂性,如果策略数量过多,可能会导致策略对象的管理变得复杂。此外,过度使用策略模式可能导致设计过于抽象,增加了理解难度。 总的来说,策略模式是一种强大的...
然而,策略模式也存在一些潜在的缺点: - 如果策略类的数量过多,可能会导致系统变得复杂。 - 客户端必须了解所有可用的策略,以便选择正确的策略。 在实际应用中,策略模式广泛用于各种场景,如排序、搜索、支付...
本文档深入探讨C#中的策略模式,包括其结构、优缺点及实际应用案例。 #### 策略模式概述 策略模式的核心思想是将一系列算法封装成单独的对象,从而使得它们可以互相替换。这不仅提高了代码的可读性和可维护性,还...
策略模式是一种设计模式,主要目的是将算法或策略的实现与使用它们的客户端代码解耦,使得算法可以在不修改客户端代码的情况下进行扩展或更改。在Java中,策略模式通常通过定义接口和实现这些接口的具体策略类来实现...
然而,策略模式也有其缺点: 1. 如果策略类数量过多,可能会导致系统复杂性增加。 2. 客户端必须了解所有策略类,并选择合适的策略,这可能增加了客户端的复杂性。 在`DesignPattern1.11`这个压缩包文件中,可能...
在"设计模式系列博客--策略模式"中,你可能会深入探讨策略模式的原理、应用场景、优缺点以及如何在实际项目中有效地使用它。通过阅读博客和配套代码,你可以更深入地理解这个设计模式,提升自己的编程技巧和设计能力...
策略模式的缺点: 1. 可能会增加系统的复杂度。 2. 需要在编译时确定策略的选择。 策略模式的应用场景: 1. 需要在运行时选择不同的算法实现时。 2. 需要使得算法的变化独立于使用它们的客户端时。 3. 需要...
在提供的PPT中,可能会详细解释策略模式的概念、结构、优缺点以及如何在实际项目中应用。此外,通过比较不使用策略模式和使用策略模式的小例子,可以帮助初学者更好地理解这种设计模式如何提高代码的可维护性和可...
然而,策略模式也存在一些缺点: 1. 增加了系统的复杂性:如果策略数量过多,可能会导致系统类的数量增加,使得系统更复杂。 2. 客户端必须了解并创建策略对象:客户端需要知道所有可用的策略,并根据需求选择合适的...
策略模式允许我们将算法封装到独立的可互换的策略类中,使得算法的变化不会影响到使用它的客户代码,实现了抽象和实现的解耦。 在《Head First 设计模式》这本书中,作者通过生动有趣的例子解释了策略模式的概念。...