开发者社区> skyme> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

设计模式(2)-策略模式之多用组合少用继承

简介:
+关注继续查看

首先看一下策略模式的意图

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

结构

2011040809040023.jpg

适用性

许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。

这样看起来非常抽象,结合上个例子,修改一下程序的结构,根据策略模式。

类图如下

2011040810191016.jpg

修改后程序如下,添加Context.h,Context.cpp,修改main

Context.h


class Context
{
private:
 Operaton* operaton;
public:
 Context();
 Context(Operaton* oper);
 virtual ~Context();
 
 virtual int getResult();
 
};

Context.cpp

#include "stdafx.h"
#include "Operaton.h"
#include "Context.h"
 
 
Context::Context(){
 
}
 
Context::Context(Operaton* oper){
 operaton = oper;
}
 
Context::~Context(){
 
}
 
int Context::getResult(){
 return operaton->getResult();
}

main

#include "stdafx.h"
#include <string>
#include <iostream>
#include "Operaton.h"
#include "OperatonAdd.h"
#include "OperatonDiv.h"
#include "OperatonMul.h"
#include "OperatonSub.h"
#include "Context.h"
 
using namespace std;
 
int main(int argc, char* argv[])
{
 int strNumA,strNumB;
 int strOperator;
 cout<<"请输入数字A:\n";
 cin>>strNumA;
 cout<<"请选择运算符号(1,+,2,-,3,*,4,/):\n";
 cin>>strOperator;
 cout<<"请输入数字B:\n";
 cin>>strNumB;
 
 int strResult = 0;
 Operaton *op;
 Context *context;
 
 switch(strOperator)
 {
 case OPERATOR_ADD:
 op = new OperatonAdd();
 break;
 case OPERATOR_MINUS:
 op = new OperatonSub();
 break;
 case OPERATOR_MUTHL:
 op = new OperatonMul();
 break;
 case OPERATOR_DIV:
 op = new OperatonDiv();
 break;
 default:
 cout<<"输入有错误!"<<endl;
 break;
 }
 
 op->numA = strNumA;
 op->numB = strNumB;
 context = new Context(op);
 strResult = context->getResult();
 cout<<"得到的结果是:"<<strResult;
 return 0;
}

现在有个问题,switch又跑到客户端来处理了。

结合简单工厂优化一下代码吧!

修改后的程序如下

Context.h


#include "Operaton.h"
#include "OperatonAdd.h"
#include "OperatonDiv.h"
#include "OperatonMul.h"
#include "OperatonSub.h"
 
 
class Context
{
private:
 Operaton *op;
public:
 Context();
 Context(int strOperator);
 virtual ~Context();
 
 virtual int getResult(int numA,int numB);
 
};

Context.cpp

#include "stdafx.h"
#include "Context.h"
 
Context::Context(){
 
}
 
Context::Context(int strOperator){
 switch(strOperator)
 {
 case OPERATOR_ADD:
 op = new OperatonAdd();
 break;
 case OPERATOR_MINUS:
 op = new OperatonSub();
 break;
 case OPERATOR_MUTHL:
 op = new OperatonMul();
 break;
 case OPERATOR_DIV:
 op = new OperatonDiv();
 break;
 default:
 cout<<"输入有错误!"<<endl;
 break;
 }
}
 
Context::~Context(){
 
}
 
int Context::getResult(int numA,int numB){
 return op->getResult(numA,numB);
}

main

#include "stdafx.h"
#include <string>
#include <iostream>
#include "Context.h"
 
using namespace std;
 
int main(int argc, char* argv[])
{
 int strNumA,strNumB;
 int strOperator;
 cout<<"请输入数字A:\n";
 cin>>strNumA;
 cout<<"请选择运算符号(1,+,2,-,3,*,4,/):\n";
 cin>>strOperator;
 cout<<"请输入数字B:\n";
 cin>>strNumB;
 
 int strResult = 0;
 
 Context *context;
 context = new Context(strOperator);
 strResult = context->getResult(strNumA,strNumB);
 cout<<"得到的结果是:"<<strResult;
 return 0;
}

修改后,客户端的代码已经和原来一样了,还有一个很重要的一点,客户端现在只要处理一个Context对象就可以了,减少了代码之间的耦合。

策略模式封装了变化。

采用策略模式的好处主要有以下几点:
1.提供了管理相关的算法族的办法。
2.提供了可以替换继承关系的办法。
3.避免使用多重条件转移语句
但是它也自身的缺点:
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2.造成很多的策略类。

对于这种处理,可以将原来混在一起的继承有效的分离出来,将原来各种处理放到一个类中,即Context,下面再举一个例子说明一下吧。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
设计模式-策略模式
在策略模式中,一个行为或其算法可以在运行时更改,这种类型的设计模式属于策略模式
21 0
设计模式之策略模式
记得在中学时代,每次考完老师评讲试卷,都会说这道题有多少种解法,然后在黑板上板书第一种、第二种等解法,其实这个情况就类似于今天的情况,也就是策略模式。他表示的是在遇到一种问题有多种解法的时候,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
16 0
设计模式之策略
设计模式之策略
25 0
【设计模式】策略模式
 笔者在看JDK源码的同时也穿插着看设计模式,之前有涉猎设计模式,但是没有进行总结和提炼,现在再读一遍设计模式,感觉受益匪浅,也特此进行记录。下面设计模式系列是以《Head First 设计模式》书为参考。有兴趣的读者可以购买,讲解得浅显易懂。
20 0
设计模式之策略模式
介绍 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
30 0
设计模式之策略模式
策略模式 定义:策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于算法的客户。如上图,我们在开发一个Duck类时候,想要实现不同的鸭子类,如绿头鸭,飞鸭,还有橡皮鸭等,这些鸭子各有各的行为,也有共同的行为。
1080 0
设计模式之策略模式
策略模式即设计不同的策略应用于不同的实现上。 代码实现如下: //动物 public abstract class Animal { private Behavior behavior;//让animal和b...
627 0
设计模式:策略模式
之前的设计模式帖子  设计模式系列目录 今天说一下策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 换句话说策略模式,是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,比如吃东西的行为,有的人喜欢狼吞虎咽,有的人 喜欢细嚼慢咽,有的人喜欢边吃边说 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
549 0
+关注
437
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载