三、策略模式

由于手中没有面向对象的项目,于是决定把大话设计模式用c++写一遍加深映像!


面向对象的好处:可维护,可扩展,可复用,灵活性好。

原则常记心中:职责单一、开放-封闭、依赖倒转、迪米特--->(低耦合)


职责单一:多个职责耦合在一起时一个职责变化可能会影响整体,为了维护更加灵活,尽量让功能原子化。对一个类而言,应该仅有一个引起它变化的原因。

开放-封闭:类应该可以扩展(开放),但是不可修改(封闭)。

依赖倒转:针对接口编程,不要对实现编程。把父类都替换成它的子类,程序的行为没有变化。

迪米特:如果两个类不必彼此直接通讯,那么这两个类就不应当直接的相互作用。如果其中一个类需要调用另一个类的某一个方法,可以通过第三者转发这个调用。

策略模式

策略模式

策略模式与简单工厂模式对比,从Context与OperationFactory可以发现

1、OperationFactory是返回一个Operation指针,而Context是在内部定义一个Operation指针,在内部通过指针调用Operation的方法。

2、客户端的代码访问Context,而简单工厂需要访问OperationFactory与Operation。耦合更低

#include<iostream>
#include<stdio.h>
#include <string>
using namespace std;
class Operation{//运算类
protected:
	double numberA = 0;
	double numberB = 0;
	
public:
		void set_number(double a,double b){
			numberA=a;
			numberB=b;
		}
		virtual double GetResult()
		{
			double result =0;
			return result;
		}
};

class operationAdd:public Operation{//加法
public:
	double GetResult()
	{
		return numberA+numberB;
	}
};

class operationSub:public Operation{//减法
public:
	double GetResult()
	{
		return numberA-numberB;
	}
};

//这是一个装饰类,在里面管理一个Operation的指针
 class Context{
public:
	Operation *oper;
	Context(string s,int a,int b)
	{      //让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户
		 if(s=="+")oper=new operationAdd();
		 else if(s=="-")oper=new operationSub();
		
		 oper->set_number(a,b);
	 }
	void get_oper()
	 {
		cout<<oper->GetResult();
	 }
 };
int main()
{
	//与简单工厂相比客服端接触的类只有一个,而简单工厂需要认识两个类
	 Context *who=new Context("+",12,45);
	who->get_oper();
	return 0;
}


简单工厂模式是创建的对象,且由该对象调用其内部的指定算法,主要是针对的对象之间的行为差异,单独封装
策略模式是针对的对象内部行为的算法,可以看作是一个集合,是允许多个策略实体进行叠加的。但工厂模式就不成。
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章