求批评,我刚开始看Headcall First设计模式
菜鸟一名,以前浪费了很多时间。刚开始看书,写了一个小程序。就是它有关Duck的说明,我也不知道这个是什么模式。我自己觉得写的很不优雅,虽然能正常输出。比如该用接口也就是抽象类,结果我不会弄。而且用了很多指针。
.h文件
- C/C++ code
class FlyBehavior//这里想用抽象类,感觉才规范。可是不知道该如何弄{public: FlyBehavior(void){}; virtual ~FlyBehavior(void){}; virtual void fly(void){};};class QuackBehavior//这里想用抽象类,感觉才规范。可是不知道该如何弄{public: QuackBehavior(void){}; virtual ~QuackBehavior(void){}; virtual void quack(void){};};class FlyWithWings : public FlyBehavior{public: FlyWithWings(){}; void fly(){cout<<"I can fly with wings!"<<endl;};};class FlyNoWay : public FlyBehavior{public: FlyNoWay(){}; void fly(){cout<<"I can't fly any way."<<endl;};};class Quack : public QuackBehavior{public : Quack(){}; void quack(){cout<<"I can quack!"<<endl;};};class Squeak : public QuackBehavior{public: Squeak(){}; void quack(){cout<<"I can squeak"<<endl;};};class Duck{public: Duck(void); ~Duck(void); FlyBehavior* flyBehavior;//这里觉得似乎不该用指针 QuackBehavior* quackBehavior; void performQuack(); void performFly(); void setFlyBehavior(FlyBehavior* f); void setQuackBehavior(QuackBehavior* q);};class MallardDuck : public Duck{public : MallardDuck() { this->flyBehavior = new FlyWithWings(); this->quackBehavior = new Squeak(); }};
cpp文件
- C/C++ code
Duck::Duck(void){}Duck::~Duck(void){}void Duck::performFly(){ this->flyBehavior->fly();}void Duck::performQuack(){ this->quackBehavior->quack();}void Duck::setFlyBehavior(FlyBehavior* f){ this->flyBehavior = f;}void Duck::setQuackBehavior(QuackBehavior* q){ this->quackBehavior = q;}
测试代码
- C/C++ code
int _tmain(int argc, _TCHAR* argv[]){ Duck* myDuck = new MallardDuck(); myDuck->performQuack(); myDuck->performFly(); Duck* model = new ModelDuck(); model->performFly(); model->setFlyBehavior(new FlyWithWings());//题外话,这里new出来的东西,怎么delete呢? model->performFly(); return 0;}
运行结果
- C/C++ code
I can squeakI can fly with wings!I can't fly any way.I can fly with wings!
[解决办法]
看看先~~
[解决办法]
抽象类请给它定义纯虚析构函数,注意纯虚析构函数虽然是“纯虚”的,但是必须有函数体
class AbstractClass
{
public:
virtual ~AbstractClass() = 0;
public:
// 其他函数 如果有的话
};
// 纯虚析构函数体
AbstractClass::~AbstractClass()
{}
[解决办法]
仔细看了一下,写得不错呀。
用了两种模式:Builder和Factory Method(代码表现得不是很明显)
接口确实通常以抽象类来实现。但用带虚函数的类也是没有问题的,只要你在派生类覆盖基类的虚函数就可以了(纯虚函数的意思就是强迫你这么干,否则编译出错)
在Duck类中用指针作为成员变量也没有什么问题。
有一个小问题,MallardDuck要提供析构函数,否则会出现memory leak之类的问题。
- C/C++ code
class MallardDuck : public Duck{public : MallardDuck() { this->flyBehavior = new FlyWithWings(); // 在析构函数里要delete flyBehavior this->quackBehavior = new Squeak(); // 在析构函数里要delete quackBehavior }};
[解决办法]