设计模式: 策略模式

设有一基类Duck, 因为要添加新功能所以可能要修改基类, 其中可能遇到的问题有:

1. 代码在子类中重复.

2. 很难知道所有子类的全部行为.

3. 改变会牵一发而动全身, 造成其他子类不必要的改变.

解决方法为:

1. 找出应用中可能要变化之处, 把它们独立出来

2. 将可能变化的行为设计为接口, 而不是在类中实现它们

3. 多使用类似接口的组合而不是继承


示例:


//strategy pattern implemented by using fuction pointer
class Duck
{
public:
	typedef void (*FlyBehavior)();
	explicit Duck (FlyBehavior _fly_behavior = defaultFlyBehavior) :
		fly_behavior (_fly_behavior)
	{}
	void fly ()
	{
		fly_behavior();
	}
	void setFlyBehavior (const FlyBehavior&);
private:
	FlyBehavior fly_behavior;
};
void Duck::setFlyBehavior (const FlyBehavior &_fly_behavior)
{
	fly_behavior = _fly_behavior;
}

void FlyNoWay () { cout << "I cannot fly!"; }

int main ()
{
	ios::sync_with_stdio (false);
	auto duck = make_shared
   
   
    
    (FlyNoWay);
	duck->fly ();
	cout << "\n";
	duck->setFlyBehavior (defaultFlyBehavior);
	duck->fly ();
	cout << endl;
	return 0;
}

//strategy implement by Functional way
class Duck
{
public:
	typedef std::function
    
    
     
      FlyBehavior;
	explicit Duck (FlyBehavior _flyBehavior = defaultFlyBehavior) :flyBehavior (_flyBehavior) {}
	void	setFlyBehavior (FlyBehavior _flyBehavior)
	{
		flyBehavior = _flyBehavior;
	}
	void Fly ()
	{
		flyBehavior ();
	}
private:
	FlyBehavior flyBehavior;
};

int main ()
{
	ios::sync_with_stdio (false);
	auto duck = make_shared
     
     
      
       ();
	duck->Fly ();
	cout << "\n";
	duck->setFlyBehavior (flyNoWay);
	duck->Fly ();
	cout << endl;
	return 0;
}

//strategy pattern by virtual function
class FlyBehavior
{
public:
	virtual void Fly () = 0;
	virtual ~FlyBehavior() = default;
};

class FlyWithWings : public FlyBehavior
{
public:
	void Fly ()override
	{
		cout << "I am flying~";
	}
};

class FlyNoWay :public FlyBehavior
{
public:
	void Fly ()override
	{
		cout << "I am cannot Fly!";
	}
};

class Duck
{
public:
	explicit 
		Duck (shared_ptr
      
      
       
        _flyBehavior
		 = make_shared
       
       
         ()) : flyBehavior (_flyBehavior) {} virtual ~Duck() = default; virtual void Fly () { flyBehavior->Fly (); } void setFlyBehavior (shared_ptr 
        
          _flyBehavior) { flyBehavior = _flyBehavior; } private: shared_ptr 
         
           flyBehavior; }; int main () { ios::sync_with_stdio (false); auto duck = make_shared 
          
            (); duck->Fly (); cout << "\n"; duck->setFlyBehavior (make_shared 
           
             ()); duck->Fly (); cout << endl; return 0; } 
            
           
          
         
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值