设计模式_策略模式

标签: 策略模式 设计模式 c++ 完整可运行代码 新手
142人阅读 评论(0) 收藏 举报
分类:

策略模式

(1)策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

(2)主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

(3)UML图:


(4)在策略模式结构图中包含如下几个角色:

      ● Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

      ● Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

      ● ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

(5)完整可运行的源码:

#include<iostream>
//抽象的算法类
class XStrategy
{
public:
	virtual void algorithmInterface() = 0;
};
//具体的算法类
class Strategy1 :public XStrategy
{
public:
	void algorithmInterface() override
	{
		std::cout << "use method 1" << std::endl;
	}
};
//具体的算法类
class Strategy2 :public XStrategy
{
public:
	void algorithmInterface() override
	{
		std::cout << "use method 2" << std::endl;
	}
};
//context类:维护一个算法类实例
class Context
{
public:
	Context(XStrategy* strategy) { maStrategy = strategy; }
	void ContextInterface() 
	{
		maStrategy->algorithmInterface();
	}
private:
	XStrategy * maStrategy;
};

int main()
{	//给Context类切换不同的算法
	Context* context = new Context(new Strategy1);
	context->ContextInterface();
	context = new Context(new Strategy2);
	context->ContextInterface();
	return 0;
}

(6)运行截图:



(7)策略模式的优缺点:

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

(8)使用场景:

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 

2、一个系统需要动态地在几种算法中选择一种。 

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

查看评论

大话设计模式—策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。大话设计模式中程杰老师给出的定义是这样的:策略模式(Strategy),定义了...
  • lmb55
  • lmb55
  • 2016-03-23 23:59:47
  • 2134

Java设计模式——Comparable接口&&Comparator(CC系)策略模式的应用

Comparable接口&&Comparator接口:突然想起了民国时期的CC系,哈哈^_^ 转自:http://www.cnblogs.com/baizhanshi/p/6201875.html ...
  • scliu12345
  • scliu12345
  • 2017-03-04 17:17:52
  • 465

设计模式系列之六:策略模式

前言策略模式是设计模式中的行为型模式,所谓行为型就是其主要使用在方法有很大灵活性的情况。而之前的工厂模式主要是对创建对象的优化,减少程序中使用new对象的次数。策略模式在Java源码中也是很常见的,比...
  • u011116672
  • u011116672
  • 2016-03-27 21:57:18
  • 677

【学习笔记javascript设计模式与开发实践(策略模式)----5】

第5章策略模式  在程序设计中我们往往会遇到实现某一功能有多种方案可以选择。比如一个压缩算法,我们可以选择zip算法,也可以选择gzip算法。 这些算法灵活多样,而且可以随意互相替换。这种解决方案就是...
  • pigpigpig4587
  • pigpigpig4587
  • 2015-12-01 17:20:31
  • 964

设计模式--spring源码中使用策略模式(Strategy Pattern)

策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下: 定义一组算法,将每个算法都封装起...
  • a137268431
  • a137268431
  • 2016-07-04 17:32:14
  • 1391

设计模式——行为型模式之借助策略模式(Strategy Pattern)减少使用不必要的if-else if -else和switch-case(三)

策略模式(Strategy Pattern)是一种比较简单的行为型模式——定义一组算法,将每个算法都封装起来,并且使它们之间可以互换(Define a family of algorithms,enc...
  • CrazyMo_
  • CrazyMo_
  • 2017-11-14 14:13:25
  • 680

Java设计模式——策略模式实现及原理

简介 定义 策略模式:将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现。并使他们可以相互替换,从而导致客户端程序独立于算法的改变。 策略模式中的设计原则:变化的抽象成接口;面向...
  • Goskalrie
  • Goskalrie
  • 2016-09-08 16:22:11
  • 3368

策略模式-商场促销-大话设计模式

类结构://父类,商场结账的算法 public interface SuperCash { //得到算过后的结账金额 public double getcash(double cash); }//...
  • wxwzy738
  • wxwzy738
  • 2012-05-31 19:43:18
  • 2148

Head First 设计模式学习笔记 ——策略模式

Head First 设计模式学习 ——策略模式简单理解     问题来源:     在子类继承父类时,如果子类不需要使用父类中的某些方法,该如何处理?     举个例子,如下图所示,父类Duck类抽...
  • u010429424
  • u010429424
  • 2016-07-27 19:22:41
  • 538

PHP设计模式——策略模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化,即封装变...
  • jhq0113
  • jhq0113
  • 2015-05-16 22:15:29
  • 4476
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 498
    排名: 10万+
    最新评论