- 浏览: 350832 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (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 197Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 353https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1202https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 414https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 508// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 514https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5028583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 526参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 1999基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 8421 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1492OpenSSL命令---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 1826ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 802转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1796转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 984C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 916转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 926转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 744参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1519转自 http://blog.csdn.net/weixinh ...
相关推荐
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第 11章陆续介绍的设计 5b4 式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes ...
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。*后三章比较...
《HeadFirst设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、...
《Head First设计模式(中文版)》的产品设计应用神经生物学、认知科学,以及学习理论,这使得此书能够将这些知识深深地印在你的脑海里,不容易被遗忘。《Head First Design Patterns》的编写方式采用引导式教学,不...
《Head First设计模式》作者Eric Freeman;ElElisabeth Freeman是作家、讲师和技术顾问。本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里,不容易被遗忘。...