- 浏览: 369614 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
1 概念
策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
2 策略模式的结构
封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。
3 设计原则
a) 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
b) 针对借口编程,而不是针对实现编程;
c) 多用组合,少用继承;
d) 含有许多条件语句(if-else)的代码意味着需要使用Strategy模式
示例代码:
Java代码示例
策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)
2 策略模式的结构
封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。
3 设计原则
a) 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
b) 针对借口编程,而不是针对实现编程;
c) 多用组合,少用继承;
d) 含有许多条件语句(if-else)的代码意味着需要使用Strategy模式
示例代码:
#ifndef STRATEGY_H #define STRATEGY_H #include <iostream> using namespace std; //策略模式 namespace Strategy { ////////////////////////////////////////////////////////////////////////// class FlyBehavior { public: virtual void fly() = 0; }; class FlyWithWings : public FlyBehavior { public: virtual void fly() { cout << "I'm flying!!" << endl; } }; class FlyNoWay : public FlyBehavior { public: virtual void fly() { cout << "I can't fly!" << endl; } }; class FlyRocketPowred : public FlyBehavior { public: virtual void fly() { cout << "I'm flying with a rocket!" << endl; } }; ////////////////////////////////////////////////////////////////////////// class QuackBehavior { public: virtual void quack() = 0; }; class Quack : public QuackBehavior { public: virtual void quack() { cout << "Quack" << endl;} }; class MuteQuack : public QuackBehavior { public: virtual void quack() { cout << "<<Silence>>" << endl; } }; class Squack : public QuackBehavior { public: virtual void quack() { cout << "Squack" << endl;} }; ////////////////////////////////////////////////////////////////////////// class Duck { public: Duck(){} virtual ~Duck(){} virtual void display() = 0; virtual void performFly() { if ( m_FlyBehavior != NULL) { m_FlyBehavior->fly(); } } virtual void performQuack() { if ( m_QuackBehavior != NULL) { m_QuackBehavior->quack(); } } virtual void swim() { cout << "All ducks float, even decoys!" <<endl; } virtual void setFlyBehavior(FlyBehavior* fb) { if (fb != NULL) { delete m_FlyBehavior; m_FlyBehavior = fb; } } virtual void setQuackBehavior(QuackBehavior* qb) { if (qb != NULL) { delete m_QuackBehavior; m_QuackBehavior = qb; } } protected: FlyBehavior* m_FlyBehavior; QuackBehavior* m_QuackBehavior; }; class MallardDuck : public Duck { public: MallardDuck() { m_QuackBehavior = new Quack(); m_FlyBehavior = new FlyWithWings(); } virtual ~MallardDuck() { if (m_FlyBehavior != NULL) { delete m_FlyBehavior; m_FlyBehavior = NULL; } if (m_QuackBehavior != NULL) { delete m_QuackBehavior; m_QuackBehavior = NULL; } } virtual void display() { cout << "I'm a real Mallard duck" << endl; } }; class ModelDuck : public Duck { public: ModelDuck() { m_FlyBehavior = new FlyNoWay(); m_QuackBehavior = new Quack(); } virtual ~ModelDuck() { if (m_FlyBehavior != NULL) { delete m_FlyBehavior; m_FlyBehavior = NULL; } if (m_QuackBehavior != NULL) { delete m_QuackBehavior; m_QuackBehavior = NULL; } } virtual void display() { cout << "I'm a model duck" << endl; } }; ////////////////////////////////////////////////////////////////////////// class MiniDuckSimulator { public: void run() { //UnitTest1 Duck* pMallard = new MallardDuck(); pMallard->performQuack(); pMallard->performFly(); delete pMallard; //UnitTest2 Duck* pModel = new ModelDuck(); pModel->performFly(); pModel->setFlyBehavior(new FlyRocketPowred()); pModel->performFly(); delete pModel; } }; }//namespace Strategy #endif
Java代码示例
//1 Quack Behavior /////////////////////////////////////////////////// public interface QuackBehavior{ public void quack(); } public class MuteQuack implements QuackBehavior{ public void quack(){ System.out.println("<< silence >>"); } } public class Quack implements QuackBehavior{ public void quack(){ System.out.println("Quack"); } } public class Squeak implements QuackBehavior{ public void quack(){ System.out.println("Squeak"); } } //2 Fly Behavior /////////////////////////////////////////////////// public interface FlyBehavior{ public void fly(); } public class FlyNoWay implements FlyBehavior{ public void fly(){ System.out.println("I can't fly!"); } } public class FlyWithWings implements FlyBehavior{ public void fly(){ System.out.println("I'm flying!"); } } public class FlyRocketPowered implements FlyBehavior{ public void fly(){ System.out.println("I'm flying with a rocket!"); } } //3 Duck /////////////////////////////////////////////////// public abstract class Duck{ FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){ } public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void swim(){ System.out.println("All ducks float, even decoys!"); } public void setFlyBehavior(FlyBehavior fb){ flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; } } public class MallardDuck extends Duck{ public MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display(){ System.out.println("I'm a real Mallard duck"); } } public class ModelDuck extends Duck{ public ModelDuck(){ flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display(){ System.out.println("I'm a model duck"); } } //4 Test Simulator /////////////////////////////////////////////////// public class MiniDuckSimulator{ public static void main(String[] args){ Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly(); Duck model = new ModelDuck(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }
C:\Users\jacky_dai\Desktop>java MiniDuckSimulator Quack I'm flying! I can't fly! I'm flying with a rocket! 请按任意键继续. . .
- 策略模式.zip (671 Bytes)
- 下载次数: 1
- strategy.zip (914 Bytes)
- 下载次数: 0
- Strategy模式实例.zip (120 KB)
- 下载次数: 0
- _行为模式__head_first_设计模式之策略模式_strategy_.zip (98.2 KB)
- 下载次数: 0
- 1_设计模式入门(策略模式)-_Java.zip (12.9 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 247Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 410https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1325https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 476https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 573// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 579https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5728583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 599参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2154基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1880ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 870转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1907转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1085C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 968转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1611转自 http://blog.csdn.net/weixinh ...
相关推荐
《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...
在《Head First设计模式》的第一章中,作者可能通过生动的示例和易于理解的图表,解释了如何在实际问题中识别策略模式的应用场景,以及如何有效地实现和使用这个模式。书中可能涵盖了以下内容: - 策略模式的基本...
总结来说,《Head First 设计模式》中的策略模式章节,通过C++代码展示了如何将行为作为策略对象,使得对象可以在运行时选择和切换行为,提高了代码的灵活性和可重用性。这个例子中的`TestDuck`文件很可能是用来测试...
总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...
《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...
《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
《Head First Design Patterns》是一本深入浅出介绍设计模式的图书,由Eric Freeman、Elisabeth Freeman、Bert Bates和Kathy Sierra联合编写。本书结合认知科学原理和神经生物学研究,采用引导式教学方法,通过故事...
第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...
总的来说,《Head First 设计模式》是一本值得反复研读的经典之作,它以直观易懂的方式引导读者探索设计模式的世界,无论你是初入编程殿堂的新手,还是经验丰富的开发者,都能从中受益匪浅。下载这本书的PDF版本,你...
《HeadFirst设计模式源代码》是一本面向程序员的深度学习设计模式的书籍,它通过直观易懂的方式将复杂的概念转化为生动的图像和有趣的例子,帮助读者深入理解并掌握设计模式。设计模式是软件工程中的一种最佳实践,...
《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...
《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...
《Head First 设计模式》是一本非常受欢迎的软件设计书籍,它以易懂且生动的方式介绍了23种经典的GOF设计模式。这本书的源代码包含了书中所有示例的实现,对于学习和理解设计模式有着极大的帮助。源代码的下载使得...
《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特、生动的方式讲解了设计模式这一核心的软件工程概念。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
《Head First设计模式》是一本深受开发者欢迎的设计模式学习书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,帮助读者深入理解设计模式的核心概念。这本书的官方源码提供了书中所讲解的每个设计模式的实际...