`

[行为模式] head first 设计模式之策略模式(strategy)

 
阅读更多
1 概念
    策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

2 策略模式的结构
   封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
   抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。
   具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。

3 设计原则
  a) 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;
  b) 针对借口编程,而不是针对实现编程;
  c) 多用组合,少用继承;
  d) 含有许多条件语句(if-else)的代码意味着需要使用Strategy模式




示例代码:

#ifndef   STRATEGY_H
#define   STRATEGY_H

#include <iostream>
using namespace std;

//策略模式
namespace Strategy
{

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

class FlyWithWings : public FlyBehavior
{
public:
    virtual void fly() { cout << "I'm flying!!" << endl; }
};

class FlyNoWay : public FlyBehavior
{
public:
    virtual void fly() { cout << "I can't fly!" << endl; }
};

class FlyRocketPowred : public FlyBehavior
{
public:
    virtual void fly() { cout << "I'm flying with a rocket!" << endl; }
};

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

class Quack : public QuackBehavior
{
public:
    virtual void quack() { cout << "Quack" << endl;}
};

class MuteQuack : public QuackBehavior
{
public:
    virtual void quack() { cout << "<<Silence>>" << endl; }
};

class Squack : public QuackBehavior
{
public:
    virtual void quack() { cout << "Squack" << endl;}
};

//////////////////////////////////////////////////////////////////////////
class Duck
{
public:
    Duck(){}
    virtual ~Duck(){}

    virtual void display() = 0;
    virtual void performFly()
    {
        if ( m_FlyBehavior != NULL)
        {
            m_FlyBehavior->fly();
        }
    }
    virtual void performQuack()
    {
        if ( m_QuackBehavior != NULL)
        {
            m_QuackBehavior->quack();
        }
    }
    virtual void swim() { cout << "All ducks float, even decoys!" <<endl; }

    virtual void setFlyBehavior(FlyBehavior* fb)
    {
        if (fb != NULL)
        {
            delete m_FlyBehavior;
            m_FlyBehavior = fb;
        }
    }

    virtual void setQuackBehavior(QuackBehavior* qb)
    {
        if (qb != NULL)
        {
            delete m_QuackBehavior;
            m_QuackBehavior = qb;
        }
    }

protected:
    FlyBehavior*   m_FlyBehavior;
    QuackBehavior* m_QuackBehavior;
};

class MallardDuck : public Duck
{
public:
    MallardDuck()
    {
        m_QuackBehavior = new Quack();
        m_FlyBehavior   = new FlyWithWings();
    }
    virtual ~MallardDuck()
    {
        if (m_FlyBehavior != NULL)
        {
            delete m_FlyBehavior;
            m_FlyBehavior = NULL;
        }

        if (m_QuackBehavior != NULL)
        {
            delete m_QuackBehavior;
            m_QuackBehavior = NULL;
        }
    }

    virtual void display() { cout << "I'm a real Mallard duck" << endl; }
};

class ModelDuck : public Duck
{
public:
    ModelDuck()
    {
        m_FlyBehavior   = new FlyNoWay();
        m_QuackBehavior = new Quack();
    }
    virtual ~ModelDuck()
    {
        if (m_FlyBehavior != NULL)
        {
            delete m_FlyBehavior;
            m_FlyBehavior = NULL;
        }

        if (m_QuackBehavior != NULL)
        {
            delete m_QuackBehavior;
            m_QuackBehavior = NULL;
        }
    }

    virtual void display()
    {
        cout << "I'm a model duck"  << endl;
    }
};

//////////////////////////////////////////////////////////////////////////
class MiniDuckSimulator
{
public:
    void run()
    {
        //UnitTest1
        Duck* pMallard = new MallardDuck();
        pMallard->performQuack();
        pMallard->performFly();
        delete pMallard;

        //UnitTest2
        Duck* pModel = new ModelDuck();
        pModel->performFly();
        pModel->setFlyBehavior(new FlyRocketPowred());
        pModel->performFly();
        delete pModel;
    }

};

}//namespace Strategy

#endif



Java代码示例
//1 Quack Behavior
///////////////////////////////////////////////////
public interface QuackBehavior{
	public void quack();
}

public class MuteQuack implements QuackBehavior{
	public void quack(){
		System.out.println("<< silence >>");
	}
}

public class Quack implements QuackBehavior{
	public void quack(){
		System.out.println("Quack");
	}
}

public class Squeak implements QuackBehavior{
	public void quack(){
		System.out.println("Squeak");
	}
}


//2 Fly Behavior
///////////////////////////////////////////////////
public interface FlyBehavior{
	public void fly();
}

public class FlyNoWay implements FlyBehavior{
	public void fly(){
		System.out.println("I can't fly!");
	}
}

public class FlyWithWings implements FlyBehavior{
	public void fly(){
		System.out.println("I'm flying!");
	}
}

public class FlyRocketPowered implements FlyBehavior{
	public void fly(){
		System.out.println("I'm flying with a rocket!");
	}
}


//3 Duck
///////////////////////////////////////////////////
public abstract class Duck{
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public Duck(){
	}
	
	public abstract void display();
	
	public void performFly(){
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	public void swim(){
		System.out.println("All ducks float, even decoys!");
	}
	
	public void setFlyBehavior(FlyBehavior fb){
		flyBehavior = fb;
	}
	
	public void setQuackBehavior(QuackBehavior qb){
		quackBehavior = qb;
	}
}

public class MallardDuck extends Duck{
	public MallardDuck(){
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	
	public void display(){
		System.out.println("I'm a real Mallard duck");
	}
}

public class ModelDuck extends Duck{
    public ModelDuck(){
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}
	
	public void display(){
		System.out.println("I'm a model duck");
	}
}


//4 Test Simulator
///////////////////////////////////////////////////
public class MiniDuckSimulator{
	public static void main(String[] args){
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.performFly();
		
		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}
}



C:\Users\jacky_dai\Desktop>java MiniDuckSimulator
Quack
I'm flying!
I can't fly!
I'm flying with a rocket!
请按任意键继续. . .
分享到:
评论

相关推荐

    Headfirst设计模式中文高清PDF+附书源码

    《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...

    Head first 设计模式 第一章 策略模式 pdf + 源代码

    在《Head First设计模式》的第一章中,作者可能通过生动的示例和易于理解的图表,解释了如何在实际问题中识别策略模式的应用场景,以及如何有效地实现和使用这个模式。书中可能涵盖了以下内容: - 策略模式的基本...

    head first 设计模式 策略模式 C++ 代码

    总结来说,《Head First 设计模式》中的策略模式章节,通过C++代码展示了如何将行为作为策略对象,使得对象可以在运行时选择和切换行为,提高了代码的灵活性和可重用性。这个例子中的`TestDuck`文件很可能是用来测试...

    Head First设计模式和HeadFirst in java 源码以及23种设计模式关系图

    总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...

    HeadFirst 设计模式学习笔记1--策略模式Demo

    《HeadFirst设计模式学习笔记1--策略模式Demo》 在软件工程中,设计模式是一种解决常见问题的标准方案,它提供了一种在特定情况下组织代码的模板。策略模式是设计模式中的一种行为模式,它允许在运行时选择算法或...

    HeadFirst设计模式PPT

    《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...

    Head First Design Patterns 英文版 Head First设计模式

    《Head First Design Patterns》是一本深入浅出介绍设计模式的图书,由Eric Freeman、Elisabeth Freeman、Bert Bates和Kathy Sierra联合编写。本书结合认知科学原理和神经生物学研究,采用引导式教学方法,通过故事...

    Head.First设计模式_PDF

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Template Method、iterator、Composite、State、proxy。最后三章比较...

    head first 设计模式 PDF电子书下载

    总的来说,《Head First 设计模式》是一本值得反复研读的经典之作,它以直观易懂的方式引导读者探索设计模式的世界,无论你是初入编程殿堂的新手,还是经验丰富的开发者,都能从中受益匪浅。下载这本书的PDF版本,你...

    HeadFirst设计模式源代码

    《HeadFirst设计模式源代码》是一本面向程序员的深度学习设计模式的书籍,它通过直观易懂的方式将复杂的概念转化为生动的图像和有趣的例子,帮助读者深入理解并掌握设计模式。设计模式是软件工程中的一种最佳实践,...

    headfirst设计模式

    《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...

    HeadFirst设计模式JAVA版源码

    《HeadFirst设计模式JAVA版源码》是一份深入学习设计模式的重要资源,它基于流行的编程语言Java,旨在帮助开发者理解并应用设计模式于实际项目中。设计模式是软件工程中的重要概念,它代表了在特定场景下解决问题的...

    Head First 设计模式 源代码

    《Head First 设计模式》是一本非常受欢迎的软件设计书籍,它以易懂且生动的方式介绍了23种经典的GOF设计模式。这本书的源代码包含了书中所有示例的实现,对于学习和理解设计模式有着极大的帮助。源代码的下载使得...

    head first 设计模式 高清完整版 pdf

    《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特、生动的方式讲解了设计模式这一核心的软件工程概念。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...

    Head First设计模式官方原码

    《Head First设计模式》是一本深受开发者欢迎的设计模式学习书籍,以其独特的教学方式,通过丰富的图解和幽默的语言,帮助读者深入理解设计模式的核心概念。这本书的官方源码提供了书中所讲解的每个设计模式的实际...

Global site tag (gtag.js) - Google Analytics