按照《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;
}