Design Pattern (1)
以下是Design Pattern 之一的Strategy Pattern, C++描述
在vc2008中编译通过,4级警告级别下 0 warning
还是学生,觉得有地方还可以改进的话欢迎提出
PS:代码粘贴过来之后缩进很怪...
//interface.h
//===============================================
#pragma once
//===============================================
class FlyBehavior {
public:
virtual void fly() = 0;
};//-------------------------------------------
class FlyWithWings : public FlyBehavior {
public:
void fly();
};//-------------------------------------------
class FlyNoWay : public FlyBehavior {
public:
void fly();
};//=============================================
class QuackBehavior {
public:
virtual void quack() = 0;
};//-------------------------------------------
class Quack : public QuackBehavior {
public:
void quack();
};//-------------------------------------------
class Squeak : public QuackBehavior {
public:
void quack();
};//-------------------------------------------
class MuteQuack : public QuackBehavior {
public:
void quack();
};//=============================================
class Duck {
protected:
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;
public:
void swim() const;
void performFly() const;
void performQuack() const;
void setFlyBehavior(FlyBehavior* );
void setQuackBehavior(QuackBehavior* );
virtual void display() = 0;
};//-------------------------------------------
class MallardDuck : public Duck {
public:
MallardDuck();
~MallardDuck();
void display();
};//-------------------------------------------
class RubberDuck : public Duck {
public:
RubberDuck();
~RubberDuck();
void display();
};//-------------------------------------------
class DecoyDuck : public Duck {
public:
DecoyDuck();
~DecoyDuck();
void display();
};//=============================================
//functions.cpp
//===============================================
#include "interface.h"
#include <iostream>
using namespace std;
//===============================================
void FlyWithWings::fly(){
cout<<"I'm flying with my beautiful wings~~"<<endl;
}//-----------------------------------------
void FlyNoWay::fly(){
cout<<"I cannot fly ,555~~~"<<endl;
}//==============================================
void Quack::quack(){
cout<<"Ga~~ga~~~"<<endl;
}//-----------------------------------------
void Squeak::quack(){
cout<<"Zz~~~~~~"<<endl;
}//-----------------------------------------
void MuteQuack::quack(){
cout<<"I cannot quack.55~~"<<endl;
}//==============================================
void Duck::swim() const {
cout<<"I am swimming."<<endl;
}//------------------------------------
void Duck::performFly() const {
flyBehavior->fly();
}//------------------------------------
void Duck::performQuack() const {
quackBehavior->quack();
}//------------------------------------
void Duck::setFlyBehavior(FlyBehavior* fb){
flyBehavior = fb;
}//------------------------------------
void Duck::setQuackBehavior(QuackBehavior* qb){
quackBehavior = qb;
}//-----------------------------------------
MallardDuck::MallardDuck(){
flyBehavior = new FlyWithWings;
quackBehavior = new Quack;
}//------------------------------------
MallardDuck::~MallardDuck(){
delete flyBehavior;
delete quackBehavior;
}//------------------------------------
void MallardDuck::display(){
cout<<"I'am MallardDuck. "<<endl;
}//-----------------------------------------
RubberDuck::RubberDuck(){
flyBehavior = new FlyNoWay;
quackBehavior = new Squeak;
}//------------------------------------
RubberDuck::~RubberDuck(){
delete flyBehavior;
delete quackBehavior;
}//------------------------------------
void RubberDuck::display(){
cout<<"I'am RubberDuck. "<<endl;
}//-----------------------------------------
DecoyDuck :: DecoyDuck(){ //这里注意下
flyBehavior = new FlyNoWay;
quackBehavior = new MuteQuack;
}//------------------------------------
DecoyDuck::~DecoyDuck(){
delete flyBehavior;
delete quackBehavior;
}//------------------------------------
void DecoyDuck::display(){
cout<<"I'am DecoyDuck. "<<endl;
}//==============================================
//main.cpp
//===============================================
// Strategy Pattern.cpp : 定义控制台应用程序的入口点。
// Strategy Pattern
//===============================================
#include "interface.h"
#include <iostream>
using namespace std;
//===============================================
int main(){
FlyBehavior* fww = new FlyWithWings;
FlyBehavior* fnw = new FlyNoWay;
QuackBehavior* q = new Quack;
QuackBehavior* s = new Squeak;
QuackBehavior* m = new MuteQuack;
Duck* duck = new MallardDuck;
duck -> display();
duck -> swim();
duck -> performFly();
duck -> performQuack();
duck -> setFlyBehavior(fww);
duck -> performFly();
duck -> setFlyBehavior(fnw);
duck -> performFly();
duck -> setQuackBehavior(q);
duck -> performQuack();
duck -> setQuackBehavior(s);
duck -> performQuack();
duck -> setQuackBehavior(m);
duck -> performQuack();
delete duck;
cout<<endl;
duck = new RubberDuck;
duck -> display();
duck -> swim();
duck -> performFly();
duck -> performQuack();
duck -> setFlyBehavior(fww);
duck -> performFly();
duck -> setFlyBehavior(fnw);
duck -> performFly();
duck -> setQuackBehavior(q);
duck -> performQuack();
duck -> setQuackBehavior(s);
duck -> performQuack();
duck -> setQuackBehavior(m);
duck -> performQuack();
delete duck;
cout<<endl;
duck = new DecoyDuck;
duck -> display();
duck -> swim();
duck -> performFly();
duck -> performQuack();
duck -> setFlyBehavior(fww);
duck -> performFly();
duck -> setFlyBehavior(fnw);
duck -> performFly();
duck -> setQuackBehavior(q);
duck -> performQuack();
duck -> setQuackBehavior(s);
duck -> performQuack();
duck -> setQuackBehavior(m);
duck -> performQuack();
delete duck;
delete fww;
delete fnw;
delete q;
delete s;
delete m;
return 0;
}//==============================================