- 浏览: 546161 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (231)
- 一个操作系统的实现 (20)
- 汇编(NASM) (12)
- Linux编程 (11)
- 项目管理 (4)
- 计算机网络 (8)
- 设计模式(抽象&封装) (17)
- 数据结构和算法 (32)
- java基础 (6)
- UML细节 (2)
- C/C++ (31)
- Windows (2)
- 乱七八糟 (13)
- MyLaB (6)
- 系统程序员-成长计划 (8)
- POJ部分题目 (10)
- 数学 (6)
- 分布式 & 云计算 (2)
- python (13)
- 面试 (1)
- 链接、装载与库 (11)
- java并行编程 (3)
- 数据库 (0)
- 体系结构 (3)
- C++ template / STL (4)
- Linux环境和脚本 (6)
最新评论
-
chuanwang66:
默默水塘 写道typedef void(*Fun)(void) ...
C++虚函数表(转) -
默默水塘:
typedef void(*Fun)(void);
C++虚函数表(转) -
lishaoqingmn:
写的很好,例子简单明了,将观察者模式都表达了出来。
这里是ja ...
观察者模式——Observer
Strategy Pattern
本文总结《Design Pattern in Java 》 Chap23 Strategy. 以为用户推荐一款烟火制品选择采取不同推荐策略为例。先讲解如果不采用策略模式会怎样,然后将这些代码重构为策略模式。
1 、如果不使用策略模式 ,Customer::getRecommended() 中封装了复杂的策略选择和策略执行流程。 见图一
关键代码(choice & execution of various strategies) :
public Firework getRecommended() {
//1 、如果有促销的烟火制品,从 config/strategy.dat 中取出并返回
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.
ignored.printStackTrace();
}
//2 、注册用户使用 Rel8 引擎
if (isRegistered()) {
return (Firework) Rel8.advise ( this );
}
//3 、未注册用户,若是大客户,使用 LikeMyStuff 引擎
if (isBigSpender()) {
return (Firework) LikeMyStuff.suggest ( this );
}
//4 、未注册用户,若是小客户,随意推荐
return Firework.getRandom ();
}
由以上代码可知,主要有这样几种推荐策略:
A. 从config/strategy.dat 中读取指定推荐的烟火制品
B.Rel8 引擎
C.LikeMyStuff 引擎
D. 随机推荐
2 、使用策略模式 ,对以上代码进行重构
现在,Customer 中的关键代码是:
public static void main(String[] args) {
Firework recommendation = new Customer2().getRecommended();
System. out .println(recommendation.toString());
}
public Firework getRecommended() {
Firework recommend = getAdvisor().recommend( this );
return recommend;
}
private Advisor getAdvisor() {
if ( advisor == null ) {
if ( promotionAdvisor .hasItem())
advisor = promotionAdvisor ;
else if (isRegistered())
advisor = groupAdvisor ;
else if (isBigSpender())
advisor = itemAdvisor ;
else
advisor = randomAdvisor ;
}
return advisor ;
}
可见,我们将策略选择流程封装在getAdvisor() 中了,getAdvisor() 返回一个策略接口Advisor 的子类实例;调用这个被返回的子类实例的recommend() 方法(重写Advisor 中的recommend() 方法),可以得到推荐的Firework 实例。
*****************************************************************
*****************************************************************
另外,对于以前写得很松散的以下两种推荐方式,分别写Advisor 子类对其进行封装。封装前如下:
public Firework getRecommended() {
//1 、如果有促销的烟火制品,从 config/strategy.dat 中取出并返回
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.
ignored.printStackTrace();
}
//2 、注册用户使用 Rel8 引擎
//3 、未注册用户,若是大客户,使用 LikeMyStuff 引擎
//4 、未注册用户,若是小客户,随意推荐
return Firework.getRandom ();
}
封装后如下:
public class PromotionAdvisor implements Advisor {
private Firework promoted ;
public PromotionAdvisor() {
try {
Properties p = new Properties();
p.load(ClassLoader.
getSystemResourceAsStream ( "config/strategy.dat" ));
String promotedFireworkName = p.getProperty( "promote" );
if (promotedFireworkName != null )
promoted = Firework.lookup (promotedFireworkName);
} catch (Exception ignored) {
promoted = null ;
}
}
public boolean hasItem() {
return promoted != null ;
}
public Firework recommend(Customer c) {
return promoted ;
}
}
public class RandomAdvisor implements Advisor {
public Firework recommend(Customer c) {
return Firework.getRandom ();
}
}
3 、总结
如何记忆策略模式呢:
(1) 这里有一个概念(策略选择==> customer2.getAdvisor() )、两个实体(策略调用者==> customer2 ; 策略==> advisor接口实例 ):
(2) 具体细节
是: “策略调用者”调用其“策略选择”customer2.getAdvisor()选择一个具体的advisor接口实例(如groupAdvisor实例)赋予其成员对象advisor;advisor接口提供统一接口方法advisor.recommend()供实际执行某一个“策略”。
发表评论
-
(第十章)一个xml解析器和构造器
2013-03-10 16:40 937本章的前两节“10.1 状态机”、“10.2 ... -
享元模式——Flyweight
2012-02-17 13:10 1080享元模式——Flyweig ... -
工厂方法和抽象工厂——Factory Method & Abstract Factory
2012-01-04 17:14 2097一、使用抽象工厂和工厂方法 Factory Me ... -
单例模式——Singleton
2012-01-04 17:08 1013public class Singleton { ... -
观察者模式——Observer
2012-01-04 16:25 1330观察者模式—— Observer ... -
适配器模式——Adaptor(Adapter)
2012-01-01 18:23 1535适配器模式 —— Adapto ... -
状态模式——State (更好的实现状态机)
2011-12-28 14:10 656921. 概述 The intent o ... -
装饰者模式——Decorator
2011-12-25 11:11 1185装饰者模式—— Decorator ... -
组合模式——Composite
2011-12-24 14:27 10181. Composite 定义 : ... -
构造者模式——Builder
2011-08-10 13:59 1080构造者模式——Builder 本文是《Java设计模 ... -
责任链模式——Chain of Responsibility
2011-08-10 11:26 945一、总结《Java设计模式》Chapter12 Chain o ... -
代理模式Dynamic Proxies(四、Struts2.0拦截器Interceptor)
2011-08-01 11:31 1429一、概念和注意点: Once you write a d ... -
代理模式Remote Proxies(三、RMI)
2011-08-01 09:51 1719因为我本科毕业设计中大量采用RMI实现分布式,且使用了Ecli ... -
代理模式Image Proxies(二、最朴素实现)
2011-07-31 11:55 1005在前面《 代理模式Image Proxies(一、最朴素实现) ... -
命令模式——Command
2011-06-10 10:31 958偷懒一下,直接用JavaEye上chjavach老兄的文章了, ... -
代理模式Image Proxies(一、最朴素实现)
2011-06-03 09:27 1074A Classic Example: Image Prox ...
相关推荐
策略模式的核心组成部分包括环境(Context)、策略(Strategy)和具体策略(Concrete Strategy)。 1. **环境(Context)**:这是使用策略的对象,它维持一个对策略对象的引用,可以在运行时根据需要选择合适的策略。环境...
策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...
策略模式的核心组成部分包括环境(Context)角色、策略(Strategy)接口和具体策略(Concrete Strategy)类。环境角色是使用策略的角色,它维持一个对策略对象的引用,并在适当的时候调用策略对象的方法来执行相应的...
策略模式的核心组成部分包括上下文(Context)、策略(Strategy)和具体策略(Concrete Strategy)。上下文是使用策略的对象,它定义了客户所期望的接口,并负责调用具体策略对象的算法。策略是所有具体策略的抽象接口,它...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。这种模式的核心是策略...
在给定的压缩包文件“strategy”中,可能包含了实现策略模式的源代码示例,可以进一步研究每个类的功能和它们如何相互协作以实现策略模式。通过分析这些代码,我们可以深入理解策略模式的用法和优势,同时也可以学习...
行为型模式如观察者模式(Observer)、命令模式(Command)和策略模式(Strategy)则关注于对象间的通信和行为,使代码更易于维护和适应变化。 设计模式的核心思想是将常见问题的解决方案标准化,提供了一种通用的...
策略模式的核心组件包括上下文(Context)、策略接口(Strategy)和具体策略(Concrete Strategy)。上下文是使用策略的对象,它通过调用策略接口来执行特定的算法。策略接口定义了所有支持的算法的公共接口,具体...
策略模式的核心包括三个角色:策略(Strategy)接口、具体策略(Concrete Strategy)类以及上下文(Context)。策略接口定义了所有支持的算法的公共接口,而具体策略类实现了这些算法。上下文则使用策略接口来调用...
本文将深入探讨其中的一种——观察者模式(Observer Pattern),它是行为设计模式的一种,主要用来封装行为的变化,实现对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) ...21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)
行为型模式如策略(Strategy)、观察者(Observer)、访问者(Visitor)和模板方法(Template Method),关注对象之间的交互和职责分配。 在Java中,设计模式的应用广泛且深入。例如,单例模式在系统配置、线程池等...
策略模式是一种设计模式,它属于对象行为型模式,主要用于封装一系列相关的算法,使得可以在运行时动态选择不同的算法。在Java中,策略模式通过定义接口或抽象类来规范这些算法的行为,然后通过继承或实现这些接口/...
在"Java设计模式教程——策略模式Java开发Java经验技巧共13页.pdf.zip"这份资料中,可能会详细讲解如何在实际项目中应用策略模式,包括但不限于以下内容: 1. 策略模式的基本结构和工作原理。 2. 如何定义策略接口...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式通常通过定义一系列算法类并让它们之间可以互换来实现。这些算法都封装在一个接口或抽象基类中,使得客户端代码可以独立于具体算法...
设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间来改变算法的情况。策略模式就是为了解决这类问题而诞生的,它将每种算法封装到具有共同接口的...
策略模式是一种行为设计模式,它的主要目的是将不同的算法或行为封装在独立的可互换的类中,使得客户端代码能够灵活地选择并使用这些算法,而无需关心它们的具体实现。这种模式遵循了几条重要的设计原则: 1. **...
行为型模式则关注对象之间的交互和职责分配,如策略模式(Strategy)、观察者模式(Observer)和责任链模式(Chain of Responsibility)等,它们有助于提高代码的灵活性和可扩展性。 在C#中,设计模式的实现往往...