算法是定义好的过程,它能够根据一组输入产生一个输出.而策略是一个计划,它也涉及如何从一组输入获得一组输出.在通常情况下,与算法相比,策略是能够提供更大范围的可选方案.因而,策略通常代表一组或者一簇可以相互替换的方案.
当计算机程序存在多种策略时,程序代码会比较复杂.当有多个策略可用时,与策略相关的程序逻辑必须选择其中一个策略来执行,这时策略选择的程序代码可能变得很复杂,同时策略使用的逻辑通常也比较复杂.我们可以使用Strategy模式来整理这些代码.
策略操作定义了策略的输入和输出,而把策略的实现工作留给各个类。这些类以不同的方案来实现同一个操作,它们为用户提供统一的接口,因而这些类可以相互替换。Strategy模式允许多种策略共存,而代码不会混乱。策略模式也可以实现模式选择逻辑和策略本身相分离。
Strategy模式的意图在于把可选的策略或方案封装在不同的类中,并在这些类中实现一个共同的操作。
1.策略建模:
Strategy模式把问题的不同解决方法封装在不同的类中,有助于组织和简化代码。先来看看不使用Strategy模式情况下策略的建模方式:
现在思考一下Oozinoz公司的焰火制品推销广告策略。当客户访问Oozinoz公司的网站或给公司呼叫中心打电话时,客户会获得一些有关购买焰火制品的建议。Oozinoz公司使用了两个现有的推荐引擎来向客户推荐合适的焰火制品。Customer类选择并应用其中的一个引擎来决定应该向客户推荐哪种焰火制品。
Rel8引擎是其中的一个推荐引擎,它能够根据客户之间的相似性来向客户推荐焰火制品.在使用这种引擎之前,客户必须进行注册,并且给出一些诸如他对焰火和其他娱乐活动的喜好或厌恶等信息.
如果客户没有注册,Oozinoz公司则使用另一个名为LikeMyStuff的推荐引擎,这个引擎能够根据客户最近的购买信息向其进行推荐.如果对这两种引擎都没有提供足够的信息,该推销软件将随机选择一种焰火向客户推荐.不过,如果Oozinoz公司希望推销某种焰火制品,那么这种焰火制品将会俦被推销,而不考虑前面的因素.图1所示的各个类相互协作,从而实现向客户推荐焰火制品的行为.
LikeMyStuff和Rel8引擎分别接收一个Customer对象,并将某种焰火制品推荐给这个客户.在利用两个引擎推荐焰火制品之前,我们必须对它们进行配置.不过,LikeMyStuff需要一个数据库,而Rel8则完全依赖于对象模型.Customer类的getRecommend()方法实现了Oozinoz公司的焰火制品推销广告策略:
public Firework getRecommended() {
// if we're promoting a particular firework, return it
try {
Properties p = new Properties();
p.load(ClassLoader.getSystemResourceAsStream("config/strategy.dat"));
String promotedName = p.getProperty("promote");
if (promotedName != null) {
Firework f = Firework.lookup(promotedName);
if (f != null) return f;
}
} catch (Exception ignored) {
// If resource missing or it failed to load,
// fall through to the next approach.
}
// if registered, compare to other customers
if (isRegistered()) {
return (Firework) Rel8.advise(this);
}
// check spending over the last year
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, -1);
if (spendingSince(cal.getTime()) > 1000) return (Firework) LikeMyStuff.suggest(this);
// oh well!
return Firework.getRandom();
}
getRecommended()方法希望如果在促销焰火制品时,将焰火制品的名称保存在config目录下的strategy.dat文件中.
protmote = JSquirrel
如果没有类似这样的文件,并且客户已经注册,则getRecommended()方法会使用Rel8引擎,如果没有促销焰火制品,客户没有注册,并且客户在本系统中留有以前的购买记录,则getRecommended()方法会使用LIkeMyStuff引擎.如果客户既没有注册,也不是大客户,上面的代码则会随机选择一种焰火制品推荐给他.getRecommended()方法的确可以起作用,并且这段代码写得并不是很糟糕.不过,我们还可以让它变得更好.
Customer类依赖于其他的类来获取将被推荐的焰火制品,其中包括两个现有的推荐引擎
- 大小: 5.1 KB
分享到:
相关推荐
C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式
策略模式的核心组成部分包括上下文(Context)、策略(Strategy)和具体策略(Concrete Strategy)。上下文是使用策略的对象,它定义了客户所期望的接口,并负责调用具体策略对象的算法。策略是所有具体策略的抽象接口,它...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。...在提供的压缩包文件"strategy"中,可能包含了关于策略模式的示例代码或者详细解释,你可以解压后查看,进一步理解和学习策略模式的实现和应用。
**策略模式**是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或策略来执行不同操作的情况。策略模式就是为了解决这种问题而诞生的。 策略模式定义了一系列算法...
在写程序的时候,我们经常会碰到这样的场景:把一堆算法塞到同一段代码中,然后使用if-else或switch-case条件语句来决定...策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独
在`Demo1_Strategy`这个示例中,可能包含了多个C++源文件,分别实现了策略模式的不同方面,例如定义了策略接口、具体策略类以及上下文类的实现。通过分析这些源代码,我们可以更深入地理解策略模式的用法和优势。 ...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...
在策略模式中,有三个主要角色:策略接口(Strategy Interface)、具体策略类(Concrete Strategy Classes)和上下文(Context)。策略接口定义了所有支持的算法的公共接口,这样上下文就可以通过这个接口来调用这些...
策略模式的核心组成部分包括策略(Strategy)、上下文(Context)和具体策略(Concrete Strategies)。策略定义了算法家族,而上下文则使用这些策略,但并不知道具体的实现细节。具体策略是实现了策略接口的具体算法...
SpringBoot结合策略模式实战套路 策略模式是一种常用的设计模式,它可以使我们的代码更加灵活、可维护和可扩展。在SpringBoot项目中,策略模式可以与依赖注入机制相结合,实现更加灵活的业务逻辑处理。在本文中,...
策略模式(Strategy)是软件设计模式中的一种行为模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常涉及定义一系列算法,并将每个算法封装起来,使得它们可以相互替换,同时使得算法的变化独立于使用它...
策略模式的核心组成部分包括环境(Context)、策略(Strategy)和具体策略(Concrete Strategy)。 1. **环境(Context)**:这是使用策略的对象,它维持一个对策略对象的引用,可以在运行时根据需要选择合适的策略。环境...
策略模式的主要组成部分包括上下文(Context)、策略接口(Strategy Interface)和具体策略类(Concrete Strategy Classes)。上下文维护一个对策略对象的引用,并使用这个引用来调用策略对象的算法。策略接口定义了...
### 策略模式 Strategy Pattern #### 概述 策略模式是一种行为设计模式,它使得算法可以在运行时被更改。这种模式允许一个类的行为或其算法在运行时根据需要进行改变,通过这种方式,我们可以轻松地扩展不同的算法...
首先,策略模式由三个主要组成部分构成:上下文(Context)、策略(Strategy)接口和具体策略(Concrete Strategy)。上下文是使用策略的对象,它维护一个对策略的引用,并调用策略的接口来执行算法。策略接口定义了一组...