`
langzixin
  • 浏览: 127284 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

策略模式—大话设计模式(简约)

阅读更多

“面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类”

 

策略模式

 

   它定义了算法家族,分别封装起来,让它们之间可以相互转化,此模式让算法的变化,不会影响到使用算法的客户。

 

   图示如下



 

   应用场景(Context)

     

      需要使用ConcreteStrategy提供的算法

 

      内部维护一个Strategy的实例

 

      负责动态设置运行时Strategy具体的实现算法

 

      负责跟Strategy之间的交互和数据传递

 

   抽象策略类(Strategy)

 

      定义了一个公共的接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使

用接口或抽象类来实现

 

   具体策略类(ConcreteStrategy)

 

      实现了Strategy定义的接口,提供具体的算法实现

 

   简单的商场收银软件

 

   抽象策略类(Strategy)

 

class CashSuper {

public:
	virtual double acceptCash(double money) = 0;
};

 

   具体策略类(ConcreteStrategy)

  

class CashNormal : public CashSuper {

public:
	double acceptCash(double money) {
		
		return money;
	}
};

class CashRebate : public CashSuper {
	
private:
	double moneyRebate;

public:
	CashRebate(double pMoneyRebate) {
		
		moneyRebate = pMoneyRebate;
	}
	double acceptCash(double money) {
	
		return money * moneyRebate;
	}
};

class CashReturn : public CashSuper {
	
private:
	double moneyCondition;
	double moneyReturn;

public:
	CashReturn(double pMoneyCondition, double pMoneyReturn) {
		moneyCondition = pMoneyCondition;
		moneyReturn = pMoneyReturn;
	}
	double acceptCash(double money) {
		
		if(money >= moneyCondition) {
			return (money - (money / moneyCondition) * moneyReturn); 
		} else {
			return money;
		}
	}

};

 

   应用场景(Context)

  

   第一种

  

class CashContext {

private:
	CashSuper *cs;

public:
	CashContext(CashSuper *pcs) {
		
		cs = pcs;
	}
	double getResult(double money) {
		
		return cs->acceptCash(money);
	}
};

 

   第二种(策略与简单工厂结合)

 

      条件判断也放在应用场景中,选择具体实现的职责又Context来承担,大大简化了客户端的代码复杂度

  

class CashContext {

private:
	CashSuper *cs;

public:
	CashContext(int strategy) {
		
		switch(strategy) {

		case 0://正常收费
			cs =  new CashNormal();
			break;
		case 1:
			cs =  new CashRebate(0.8);
			break;
		case 2:
			cs =  new CashReturn(300, 100);
			break;	
		}
	}

	double getResult(double money) {
		
		return cs->acceptCash(money);
	}
};

 


总结:

 

   策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

 

   当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为,将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。(策略模式封装了变化)

 

   策略模式是用来封装算法的,在实践中,我们可以发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式来处理这种变化的可能性。

  • 大小: 4.9 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics