java设计模式的理解

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选择自己相应的行为


=================理论与实践分割线=========================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值