这是学习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;
}
运行结果:

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

549

被折叠的 条评论
为什么被折叠?



