1.Strategy设计模式主要是对对象行为的选择进行决策
先看一下定义吧
The Strategy Pattern: a famly of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
大概意思就是 有一系列算法,把他们每个算法都分别封装起来,使他们可以互相替换。策略模式可以让算法从客户端独立出来,算法的改变不会影响客户端
在网上很容易就可以古狗到策略模式的类图
每个算法都是一个具体的策略,图中ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC为3 个具体的算法,Strategy模式就是把一组具体的算法(策略)分别封装起来,并把这些封装起来的算法实现共同的一个接口 Strategy ,这个接口就是一个抽象的策略,我们的主类中拥有一个抽象策略的引用声明为Strategy接口类型,所有具体算法们都实现了抽接口中的方法AlgorithmInterface (),由于多态,所以我们可在我们的主类里直接调用抽象接口的方法AlgorithmInterface() ,这样做的好处就是我们可以在run time时使用setter方法改变具体的策略而不影响到客户的代码。
测试代码:
package {
import flash.display.Sprite;
import net.nshen.designpatterns.strategy.*;
public class designpatterns extends Sprite
{
public function designpatterns()
{
Test_Strategy()
}
public function Test_Strategy():void{
var context:Context=new Context();
//设置策略
context.strategy=new ConcreteStrategyA()
context.ContextInterface()
//runtime 更改策略B
context.strategy=new ConcreteStrategyB()
context.ContextInterface()
//runtime 更改策略C
context.strategy=new ConcreteStrategyC()
context.ContextInterface()
}
}
}
Context:
* 需要使用ConcreteStrategy提供的算法。
* 内部维护一个Strategy的实例。
* 负责动态设置运行时Strategy具体的实现算法。
* 负责跟Strategy之间的交互和数据传递。
package net.nshen.designpatterns.strategy
{
public class Context
{
private var _strategy:IStrategy
public function set strategy(p_strategy:IStrategy):void{
this._strategy=p_strategy;
}
public function ContextInterface():void{
this._strategy.AlgorithmInterface()
}
}
}
Strategy(抽象策略类):
* 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
package net.nshen.designpatterns.strategy
{
/**
*
*
* 抽象策略,可以为接口,也可以为一个抽象类,这里是接口
*
*/
public interface IStrategy
{
function AlgorithmInterface():void
}
}
ConcreteStrategy(具体策略类):
* 实现了Strategy定义的接口,提供具体的算法实现
具体策略A:
package net.nshen.designpatterns.strategy
{
public class ConcreteStrategyA implements IStrategy
{
public function AlgorithmInterface():void
{
trace("调用策略A")
}
}
}
具体策略B:
package net.nshen.designpatterns.strategy
{
public class ConcreteStrategyB implements IStrategy
{
public function AlgorithmInterface():void
{
trace("调用策略B")
}
}
}
具体策略C:
package net.nshen.designpatterns.strategy
{
public class ConcreteStrategyC implements IStrategy
{
public function AlgorithmInterface():void
{
trace("调用策略C")
}
}
}
完整代码点这里下载
在《head first design patterns》的例子中更把策略描述成行为(Behavior)的抽象,建议去看一下,由于各种各样的鸭子叫的方法和飞的方法各不相同,如下图,把鸭子的多种Fly行为和多种Quack行为独立出来,打包成两个策略包,分别实现两个抽象的接口FlyBehaviors 和 QuackBehaviors ,此时所有鸭子的父类Duck就是上面图中的Context,保存抽象策略的引用 flyBehavior , quackBehavior ,由于策略模式的好处,使得Duck的子类各种各样的鸭子可以run time选择自己相应的行为
=================理论与实践分割线=========================================================
分享到:
相关推荐
比较全面的介绍了,java的设计模式.帮助你的理解.
Java 设计模式,第二版,电子工业出版社出版 本书通过一个完整的Java项目对经典著作Design Patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为...
设计模式,让代码更优化,拓展性更高,可读性更好,让你更好地理解设计模式
基于Java的设计模式理解与实现.pdf
设计模式是一套被重复使用的代码设计经验的总结,本书面向有一定Java语言基础和一定编程经验的读者。旨在培养读者良好的设计模式思维方式,加强对面向对象思想的理解。全书共分12章,首先强调了接口和抽象类在设计...
本系统基于六种设计模式,运用到的设计模式有备忘录模式,简单工厂模式,迭代器模式,状态模式,模版方法模式,单例模式。...使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
最经典设计模式学习资料,没有之一,浅显易懂的分析设计模式使用场景,剖析设计模式设计思想,清晰的UML图表以及经典的代码案例,看完后恍然大悟,即使是java初学者也很容易理解学习。
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
这是一部介绍设计模式的书籍,是以java为基础讲的。
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
java设计模式实例,以代码的形式展示设计模式的魅力,是程序员能够更直观的理解,同时免去了大量阅读晦涩书本的过程,能够通过实例直接扩展训练,非常方便,你值得下载~
人更容易理解GoF 的《设计模式》。由于原著都是以C++为例, 以Java 为例的设计模式 基本又都以图形应用为例,而我们更关心Java 在中间件等服务器方面的应用,因此,本站 所有实例都是非图形应用,并且顺带剖析Jive 论坛...
本教程是针对那些希望通过学习设计模式来提高自身面向对象设计和开发技能的 Java 程序员的。阅读完本教程之后,您将: 了解什么是设计模式,如何描述它们以及如何将它们分为几个众所周知的类别 能够把设计模式...
java23种设计模式+23个实例demo: 关于代码的几点说明: 1. 代码为根据个人对Design Pattern的学习理解写出, 2. 每个Pattern均是一个目录,其目录名即是Pattern的名字, 所有代码用JDeveloper 9i 和JBuilder 6.0编写...
Java设计模式-图解-附代码,举例子的方式剖析所有设计模式,更容易理解。
有助于理解设计模式,很简单实用的例子,包括工厂模式、适配器模式等
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。...
Java书籍 ,设计模式,搞笑版容易理解,学习简单,易学易用
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。...