2.策略模式



1策略模式的核心内容是:

A:对应的策略的抽象两类

B:各种策略的实现类

C:策略控制器,通过这个策略控制器实现控制调用的策略。

2策略模式的作用是根据传递进去的参数不同实现调用不同的策略执行。

3策略模式具体描述

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

修改都不会影响到环境和客户端。

跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

我的追MM锦囊中有好多Strategy哦。

策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

实现的各种策略,各种策略的实现类,都必须继承抽象类

策略的设置接口类,设置不同策略

4.策略模式类图

5.代码:

#include<iostream>

#include<cmath>

#include
<string>

using
namespace
std;

//策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,

//从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下

//发生变化。策略模把行为和环境分开。环境类负责维持和查询行为类,

//各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,

//修改都不会影响到环境和客户端。

//

//跟不同类型的MM约会,要用不同的策略,有的请电影比较好,

//有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到MM的芳心,

//我的追MM锦囊中有好多Strategy哦。

//策略的抽象类,接口,抽象类的指针可以访问所有子类对象,(纯虚函数)

//实现的各种策略,各种策略的实现类,都必须继承抽象类

//策略的设置接口类,设置不同策略

//收钱的抽象类

class
CashSuper

{

public:

//收钱的纯虚函数

virtual
double
acceptMoney(double
money) = 0;

};

//正常收钱的策略

class
CashNormal
:public
CashSuper

{

public:

//正常收钱

double
acceptMoney(double
money)

{

return
money;

}

};

//打折的策略

class
CashRebate
:public
CashSuper

{

private:

double
discount;

public:

//折扣

CashRebate(double
dis)

{

discount =
dis;

}

//收钱

double
acceptMoney(double
money)

{

//折扣

return
money*discount;

}

};

class
CashReturn
:public
CashSuper

{

private:

double
moneyCondition;

double
moneyReturn;

public:

//花多少钱,返回多少钱

CashReturn(double
mc,
double
mr)

{

moneyCondition
= mc;

moneyReturn
= mr;

}

//收钱,返款

double
acceptMoney(double
money)

{

double
result =
money;

if (money
>= moneyCondition)

{

result =
money -
floor(money
/ moneyCondition)*moneyReturn;

}

return
result;

}

};

class 
CashContext

{

private:

CashSuper
*cs;

public:

CashContext(string
str)//设置策略

{

if (str
== "正常收费")

{

cs =
new
CashNormal();

}

else
if (str
== "打9折")

{

cs =
new
CashRebate(0.9);

}

else
if (str
== "满1000送200")

{

cs =
new
CashReturn(1000,
200);

}

}

double
getResult(double
money)

{

return
cs->acceptMoney(money);

}

};

int
main()

{

double
money = 1000;

//可以改变下面括号中的值,如果是下面的的一句,运行结果是800

//CashContext *cc =new CashContext("满1000送200");

//若是下面这句,显示的是1000

//CashContext *cc =new CashContext("正常收费");

//下面的这句的意思是打九折,运行结果是:900

CashContext
*cc =
new
CashContext("打9折");

cout <<
cc->getResult(money);

cin.get();

return 0;

}

时间: 2024-10-26 08:11:03

2.策略模式的相关文章

PHP设计模式-策略模式

<?php//策略模式//将一组特定的算法或行为 封装成一个类,以适应上下文环境 //策略的接口文件 约定策略的行为 针对一种情况 产生具体的策略interface Policy{ function showAd();} class Female implements Policy{ public function showAd() { echo __CLASS__.' policy'; }} class Male implements Policy{ public function showA

对设计模式的总结之简单工厂与策略模式

前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓,本文就说说我对本人对简单工厂模式.策略模式的见解. 简单工厂模式与策略模式 简单工厂模式 工作中,常常遇到需要做一个功能(鸭子),这个功能中含有可控个数的子操作功能(鸭子叫,鸭子跑,鸭子飞),而且子功能在不同的情况下处理方式又不相同(成年鸭子/小鸭子叫,成年鸭子/小鸭子跑,成年鸭子/小鸭子飞).我

Java 策略模式

Java 策略模式 @author ixenos 定义 1.封装算法:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 2.分割行为和环境:对用户屏蔽内部实现,使客户端在调用算法的时候能够互不影响地互换 策略模式的实现(面向接口编程) 方法: 1.接口多态:策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们之间可以相互替换 2.具体策略提供不同算法,环境负责维持和查询策略,把具体策略和环境分割开来,使得算法可以在不影响客户端和环境的情况下修改 角色分工:

设计模式之策略模式

一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级别的员工过多,或是对级别的调整比较频繁,那该系统就会显得复杂而脆弱.如何能将对象和算法解耦,从而使得在系统运行时能透明的改变对象的算法呢?这就到了策略模式大显身手的时候了.二.策略模式策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.策

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni

Strategy Design Pattern(策略模式)

策略模式意义在于,当我们有多种不同的算法时,程序能够动态的选择算法进行计算. 策略模式的另外一个英文名字是Policy Strategy. 策略模式最典型的里一个例子就是JAVA中复杂对象的排序(java.util.Arrays.sort,java.util.Collections.sort),用户可以自己定义各种排序算法(规则),然后在需要排序时将算法传给排序函数.从而实现排序方式的变化,获得不同的排序结果.参见:http://my.oschina.net/nox/blog/487478 下面

设计模式之-策略模式

问题描述 实现游戏的不同角色 解决方案 存在问题 策略模式 总结 问题描述 实现游戏的不同角色 某游戏中Queen,King,Knight这3种角色,每种角色都有使用武器行为,设计这三个类,提高代码的重用性和可维护性. 解决方案 Queen,King,Knight这三个角色都是角色,都可以move,可以stop,因此可以设计一个Character抽象类,抽取三个角色的共同行为,减少代码的重复性,Character定义如下: public abstract class Character { pu

PHP设计模式——策略模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化,即封装变化的算法. 适用场景: 1. 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. 2. 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. 3. 对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 4.客户端必须知道所有的策略类,并自行决定使

设计模式学习(十五) 策略模式

策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法,并且由客户端决定调用那个算法 本质: -- 分离算法,选择实现 开发中常见的场景: 代码实现: package strategy; public interface Strategy { public double getPrice(double standardPrice); } 策略接口 package strategy; public class NewCusto

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但