Head first 设计模式 策略模式之c++实现

本文通过C++实现了鸭子模拟的设计模式,包括不同的飞行行为和叫声行为。涉及的具体类有Duck、FlyBehavior、QuackBehavior等,并通过ModelDuck进行了演示。

      这是学习C++的第三天,刚进公司上班不久,要求用代码实现设计模式,手头有一本Head First设计模式的书,奈何是基于JAVA的(JAVA我也不太会orz),只好自己翻译成C++,将声明与实现分开,代码仅供参考

       首先是Duck.h

#pragma once
#ifndef DUCK_H
#define DUCK_H

class FlyBehavior;
class QuackBehavior;
class Duck
{
public:
	Duck();
	~Duck();
	virtual void display() const = 0;
	void performFly();
	void performQuack();
	void setFlyBehavior(FlyBehavior *fb);
	void setQuackBehavior(QuackBehavior *qb);
private:
	FlyBehavior *pflyBehavior;
	QuackBehavior *pquackBehavior;

};

#endif // !DUCK_H

Duck.cpp

#include "Duck.h"
#include "FlyBehavior.h"
#include "QuackBehavior.h"

Duck::Duck() {

}

Duck::~Duck(){}

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

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

void Duck::setFlyBehavior(FlyBehavior *fb)
{
	pflyBehavior = fb;
}

void Duck::setQuackBehavior(QuackBehavior *qb)
{
	pquackBehavior = qb;
}

FlyBehavior.h

#pragma once
#ifndef  FLYBEHAVIOR_H
#define  FLYBEHAVIOR_H

class FlyBehavior {
public:
	FlyBehavior();
	~FlyBehavior();
	virtual void fly() const= 0;
};
#endif // ! FLYBEHAVIOR_H

FlyBehavior.cpp

#include "FlyBehavior.h"

FlyBehavior::FlyBehavior() {

}

FlyBehavior::~FlyBehavior() {

}

QuackBehavior.h

#pragma once
#ifndef QUACKBEHAVIOR_H
#define QUACKBEHAVIOR_H

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

#endif // !QUACKBEHAVIOR_H

QuackBehavior.cpp

#include "QuackBehavior.h"
#include <iostream>


QuackBehavior::QuackBehavior() {};
QuackBehavior::~QuackBehavior() {};

飞行扩展

FlyNoWay.h

#pragma once
#ifndef FLYNOWAY_H
#define FLYNOWAY_H
#include "FlyBehavior.h"

class FlyNoWay :public FlyBehavior
{
public:
	FlyNoWay();
	~FlyNoWay();
	void fly() const override;

};

#endif // !FLYNOWAY_H

FlyNoWay.cpp

#include "FlyNoWay.h"
#include <iostream>

FlyNoWay::FlyNoWay()
{

}

FlyNoWay::~FlyNoWay()
{

}
void FlyNoWay::fly() const
{
	std::cout << "I can't fly!" << std::endl;
}

FlyWithWings.h

#pragma once
#ifndef FLYWITHWINGS_H
#define FLYWITHWINGS_H
#include "FlyBehavior.h"

class FlyWithWings :public FlyBehavior
{
public:
	FlyWithWings();
	~FlyWithWings();
	void fly() const override;

};

#endif // !FlyWithWings

FlyWithWings.cpp

#include "FlyWithWings.h"
#include <iostream>

FlyWithWings::FlyWithWings() {

}

FlyWithWings::~FlyWithWings() {

}

void FlyWithWings::fly() const
{
	std::cout << "I'm flying!" << std::endl;
}

FlyRocketPowered.h

#pragma once
#ifndef FLYROCKETPOWERED_H
#define FLYROCKETPOWERED_H

#include "FlyBehavior.h"

class FlyRocketPowered :public FlyBehavior
{
public:
	FlyRocketPowered();
	~FlyRocketPowered();
	void fly() const override;
};


#endif // !FLYROCKETPOWERED_H

FlyRocketPowered.cpp

#include "FlyRocketPowered.h"
#include <iostream>

FlyRocketPowered::FlyRocketPowered(){}

FlyRocketPowered::~FlyRocketPowered(){}

void FlyRocketPowered::fly() const
{
	std::cout << "I'm flying with a rocket!!" << std::endl;
}

鸭子扩展

ModelDuck.h

#pragma once
#ifndef MODELDUCK_H
#define MODELDUCK_H

#include "Duck.h"
#include "FlyBehavior.h"
#include "QuackBehavior.h"

class ModelDuck:public Duck
{
public:
	ModelDuck();
	~ModelDuck();
	void display() const override;
};

#endif // !MODELDUCK_H

ModelDuck.cpp

#include "ModelDuck.h"
#include <iostream>

ModelDuck::ModelDuck(){}

ModelDuck::~ModelDuck(){}

void ModelDuck::display() const {
	std::cout << "I'm a model giraffe" << std::endl; /*这里因为女朋友喜欢长颈鹿不喜欢鸭子,所以是飞天长颈鹿*/
}

叫声扩展

MuteQuack.h

#pragma once
#ifndef MUTEQUACK
#define MUTEQUACK
#include "QuackBehavior.h"

class MuteQuack :public QuackBehavior
{
public:
	MuteQuack();
	~MuteQuack();
	void quack() const  override;
};


#endif // !MUTEQUACK

MuteQuack.cpp

#include "MuteQuack.h"
#include <iostream>

MuteQuack::MuteQuack(){

}

MuteQuack::~MuteQuack(){

}

void MuteQuack::quack() const
{
	std::cout << "<<silence>>" << std::endl;
}

Squeak.h

#pragma once
#ifndef SQUEAK_H
#define SQUEAK_H

#include "QuackBehavior.h"

class Squeak:public QuackBehavior
{
public:
	Squeak();
	~Squeak();
	void quack() const override;
};

#endif // !SQUEAK_H

Squeak.cpp

#include "Squeak.h"
#include <iostream>

Squeak::Squeak() {

}

Squeak::~Squeak() {

}

void Squeak::quack() const
{
	std::cout << "squeak" << std::endl;
}

主函数

#include <iostream>

#include "ModelDuck.h"

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

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

int main() {
	ModelDuck model = ModelDuck();
	model.setFlyBehavior(new FlyNoWay());

	model.setQuackBehavior(new Squeak());


	model.display();
	model.performFly();
	model.performQuack();

	model.setFlyBehavior(new FlyRocketPowered());
	model.performFly();

	system("pause");

	return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值