head first设计模式学习笔记(一)——策略模式 C++实现

按照《head first设计模式》书上学习的内容,将其按照C++语言形式展示给大家。本人才疏学浅,难免在代码中出现错误,希望大家指正。

 

首先是两个抽象类FlyBehavior和QuackBehavior。

//FlyBehavior.h
#ifndef _FLYBEHAVIOR_H_
#define _FLYBEHAVIOR_H_

class FlyBehavior
{
public:
	FlyBehavior(){ }
	virtual ~FlyBehavior() { }
	virtual void fly() const=0;
};

#endif

 

//QuackBehavior.h
#ifndef _QUACKBEHAVIOR_H_
#define _QUACKBEHAVIOR_H_

class QuackBehavior
{
public:
	QuackBehavior(){}
	virtual ~QuackBehavior(){}
	virtual void quack() const=0;
};

#endif


然后抽象类FlyBehavior的两个派生类。

 

//FlyWithWings.h
#ifndef _FLYWITHWINGS_H_
#define _FLYWITHWINGS_H_
#include<iostream>
using namespace std;
class FlyWithWings:public FlyBehavior
{
public:
	FlyWithWings(){ }
	~FlyWithWings(){ }
	virtual void fly() const 
	{
		cout<<"I can fly"<<endl;
	}
};

#endif

 

//FlyNoWay.h
#ifndef _FLYNOWAY_H_
#define _FLYNOWAY_H_
#include<iostream>
using namespace std;

class FlyNoWay:public FlyBehavior
{
public:
	FlyNoWay(){}
	~FlyNoWay(){}
	virtual void fly() const 
	{
		cout<<"I cannot fly"<<endl;
	}
};

#endif


下面式抽象类QuackBehavior的三个派生类

//Quack.h
#ifndef _QUACK_H_
#define _QUACK_H_
#include<iostream>
using namespace std;

class Quack:public QuackBehavior
{
public:
	Quack(){}
	virtual ~Quack() {}
	virtual void quack() const
	{
		cout<<"I can 呱呱叫"<<endl;
	}
};

#endif


 

//Squeak.h
#ifndef _SQUEAK_H_
#define _SQUEAK_H_
#include<iostream>
using namespace std;

class Squeak:public QuackBehavior
{
public:
	Squeak(){}
	virtual ~Squeak() {}
	virtual void quack() const
	{
		cout<<"I can 吱吱叫"<<endl;
	}
};

#endif


 

//MuteQuack.h
#ifndef _MUTEQUACK_H_
#define _MUTEQUACK_H_
#include<iostream>
using namespace std;

class MuteQuack:public QuackBehavior
{
public:
	MuteQuack(){}
	virtual ~MuteQuack() {}
	virtual void quack() const
	{
		cout<<"I cannot shut"<<endl;
	}
};

#endif


现在我们将上面两个抽象类FlyBehavior和QuackBehavior组合到下面Duck类中。

//Duck.h
#ifndef _DUCK_H_
#define _DUCK_H_
#include "FlyBehavior.h"
#include "QuackBehavior.h"
#include<assert.h>
#include<memory>
#include <iostream>
using namespace std;
class Duck
{
private:
	auto_ptr<FlyBehavior> flyBehavior;
	auto_ptr<QuackBehavior> quackBehavior;
private:
	Duck(const Duck&);
	Duck& operator=(const Duck&);

public:
//	Duck():flyBehavior(NULL),quackBehavior(NULL){}

	Duck(FlyBehavior* fb, QuackBehavior* qb):
	flyBehavior(fb),quackBehavior(qb)
	{
		assert(fb);
		assert(qb);
		cout<<"Duck!!!"<<endl;
	}

	virtual ~Duck()=0
	{
		cout<<"~~~Duck!"<<endl;
	}
	void swim() const;
	virtual void display() const;
	void performQuack();
	void performFly();
	void setFlyBehavior(FlyBehavior* fb);
	void setQuackBehavior(QuackBehavior* qb);
};

#endif


 

//Duck.cpp
#include "Duck.h"

void Duck::swim()const
{
	cout<<"we all can swim"<<endl;
}

void Duck::display() const
{
	cout<<"I am a Duck"<<endl;
}

void Duck::performFly()
{
	flyBehavior->fly();
}

void Duck::performQuack()
{
	quackBehavior->quack();
}

void Duck::setFlyBehavior(FlyBehavior* fb)
{
	assert(fb);
	this->flyBehavior=auto_ptr<FlyBehavior>(fb);
}
void Duck::setQuackBehavior(QuackBehavior* qb)
{
	assert(qb);
	this->quackBehavior=auto_ptr<QuackBehavior>(qb);
}


 

下面我们将在基类Duck的基础上派生两个子类MallardDuck和RedheadDuck

//MallardDuck.h
#ifndef _MALLARDDUCK_H_
#define _MALLARDDUCK_H_
#include <iostream>
using namespace std;

class MallardDuck:public Duck
{
public:
	MallardDuck():Duck(new FlyWithWings,new Quack)
	{
		cout<<"MallardDuck!"<<endl;
	}

	~MallardDuck()
	{
		cout<<"~~~MallardDuck"<<endl;
	}
	void display() const
	{
		cout<<"I am a MallardDuck"<<endl;
	}
};


#endif
//RedheadDuck.h
#ifndef _REDHEADDUCK_H_
#define _REDHEADDUCK_H_
#include <iostream>
using namespace std;
class RedheadDuck:public Duck
{
public:
	RedheadDuck():Duck(new FlyNoWay,new Quack)
	{
		cout<<"RedheadDuck!"<<endl;
	}
	~RedheadDuck(){
		cout<<"~~~RedheadDuck!"<<endl;

	}
	void display() const
	{
		cout<<"I am a RedheadDuck"<<endl;
	}
};


#endif

 

 为了在main函数中包含的头文件看起来不是那么繁琐,我们将我们所需的头文件放到Ducks.h中。

//Ducks.h
#ifndef _DUCKS_H_
#define _DUCKS_H_

#include"Duck.h"

#include"FlyWithWings.h"
#include"FlyNoWay.h"

#include"Quack.h"
#include"Squeak.h"
#include"MuteQuack.h"

#include"MallardDuck.h"
#include"RedheadDuck.h"

#endif


 

下面是main函数的一部分的具体实现,大家可以在此基础上增加,验证程序是否正确。

//main.cpp
#include"Ducks.h"
int main()
{
	auto_ptr<Duck> model(new MallardDuck);
	model->display();
	model->performFly();
	model->performQuack();

	auto_ptr<Duck> model2(new RedheadDuck);
	model2->display();
	model2->performFly();
	model2->performQuack();
	model2->setFlyBehavior(new FlyWithWings);
	model2->performFly();


	return 0;
}




 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值