码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之策略模式

时间:2015-03-04 18:44:22      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

设计模式的其中三个设计原则:

1. Program to an interface, not an implementation.        接口与实现

2. Favor composition over inheritance.                           组合与继承

3. Encapulate what varies.

 

下面是这一章的实现(in C++)

技术分享

// Design-Pattern.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

/************************************************************************/
/* fly interface                                                                     */
/************************************************************************/
class FlyBehavior
{
public:
    virtual void fly() = 0;
};

/************************************************************************/
/* fly with wings                                                                     */
/************************************************************************/
class FlyWithWings: public FlyBehavior
{
public:
    void fly()
    {
        cout<<"Duck flying"<<endl;
    }
};

/************************************************************************/
/* fly no way                                                                     */
/************************************************************************/
class FlyNoWay: public FlyBehavior
{
public:
    void fly()
    {
        cout<<"Duck can‘t fly."<<endl;
    }
};

/************************************************************************/
/* quack interface                                                                     */
/************************************************************************/
class QuackBehavior
{
public:
    virtual void quack() = 0;
};

/************************************************************************/
/* quack Implementation from quack behavior                                                                    */
/************************************************************************/
class Quack: public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Duck quacking"<<endl;
    }
};


/************************************************************************/
/* squeak implementation from quack behavior                                                                     */
/************************************************************************/
class Squeak: public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Duck squeaking"<<endl;
    }
};

/************************************************************************/
/* quack no way, implementation from quack behavior                                                                     */
/************************************************************************/
class MuteQuack: public QuackBehavior
{
public:
    void quack()
    {
        cout<<"Duck can‘t quack."<<endl;
    }
};

/************************************************************************/
/* abstract class Duck                                                                     */
/************************************************************************/
class Duck
{
protected:
    FlyBehavior *flyBehavior;
    QuackBehavior *quackBehavior;

public:
    void setFlyBehavior(FlyBehavior *fly)
    {
        flyBehavior = fly;
    }

    void setQuackBehavior(QuackBehavior *quack)
    {
        quackBehavior = quack;
    }

    void performQuack()
    {
        quackBehavior->quack();
    }

    void performFly()
    {
        flyBehavior->fly();
    }

    void swim()
    {
        cout<<"Duck::swim()"<<endl;
    }

    virtual void display() = 0;
};

class MallardDuck: public Duck
{
public:
    MallardDuck()
    {
        flyBehavior = new FlyNoWay(); 
        quackBehavior = new Quack();
    }

    ~MallardDuck()
    {
        if(!flyBehavior)
            delete flyBehavior;
        if(!quackBehavior)
            delete quackBehavior;
    }

    void display()
    {
        cout<<"I‘am a MallardDuck."<<endl;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    Duck *duck = new MallardDuck();
    duck->display();
    duck->performFly();
    duck->performQuack();
    duck->setFlyBehavior(new FlyWithWings());
    duck->performFly();
    system("pause");
    return 0;
}

 

设计模式之策略模式

标签:

原文地址:http://www.cnblogs.com/wiessharling/p/4313859.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!