zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

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

    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;
    }
  • 相关阅读:
    学Python必背的初级单词,你都背了吗?
    零基础Python应该怎样学习呢?(附视频教程)
    初学Python,需要装什么软件?
    Python该怎么入门?Python入门教程(非常详细)
    c语言该怎么入门?C语言入门教程(非常详细)
    零基础学习Python web开发、Python爬虫、Python数据分析,从基础到项目实战!
    零基础学到什么程度可以找一份web前端工作?
    【spring boot】SpringBoot初学(2)
    【spring boot】SpringBoot初学(1)
    【spring】(填坑)sql注入攻击
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4313859.html
Copyright © 2011-2022 走看看