`
iwebcode
  • 浏览: 2007675 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

设计模式学习总结-策略模式(Strategy Pattern)

 
阅读更多

设计模式学习总结-策略模式(Strategy Pattern)

问题:
当我们定义一系列的算法,怎么能使得算法为应对不同的业务需要能自由的动态替换而又不影响到客户端的使用,并且算法的增减、修改都不会影响环境和客户端。

定义:
策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换。该模式可使得算法能独立于使用它的客户而变化。

意图:
Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的,跟创建什么样的产品没有关系,此模式解决的问题是把一个系列完成相同工作,却实现不同的算法(行为)包装到一系列的策略类里面,使得它们可以相互替换,提供一个访问接口,由客户端决定在什么情况下使用什么具体策略,来完成某一功能。并可以自由的添加修改相应的算法,轻松实现可插入式(Pluggable)的系统的开发。对于客户端来说,不关心实例化了那些对象,生产了那些产品,只需要提供要使用那种策略去完成某一功能。

参与者:
•抽象策略(Strategy)角色:
定义了所支持算法的公共接口,各种不同的算法以不同的方式实现这个接口,Context通过这个接口来调用ConcreteStrategy定义的算法。一般使用接口或抽象类实现。
•具体策略(ConcreteStrategy)角色:
继承抽象策略(Strategy)角色,封装了具体的算法和行为。
•Context:
策略的外部封装类,或者说策略的容器类。它维护了一个对Strategy对象的引用。负责根据不同策略动态设置运行时Strategy具体的ConcreteStrategy,并实现交互和数据传递。
UML图:


实例说明:

诺基亚手机工厂
比如Nokia公司现有中国,芬兰两家生产工厂。在中国生产的是亚太版,在芬兰生产的是欧美版,两个工厂的生产细节可能是不同的,但是都可以生产N8,N9两款手机,并且可以动态的增加手机工厂,如墨西哥工厂生产拉美版的N8,N9.

uml图如下:

代码:

复制代码
///<summary>
///手机工厂抽象策略(Strategy)角色
///</summary>
publicabstractclassIPhoneFactory
{
publicabstractvoidCreateN8();
publicabstractvoidCreateN9();
}
///<summary>
///手机工厂具体策略(ConcreteStrategy)角色
///</summary>
publicclassPhoneFactory_China:IPhoneFactory
{

publicoverridevoidCreateN8()
{
System.Console.WriteLine("我是中国生产的N8");
}

publicoverridevoidCreateN9()
{
System.Console.WriteLine("我是中国生产的N9");
}
}
///<summary>
///手机工厂具体策略(ConcreteStrategy)角色
///</summary>
publicclassPhoneFactory_Finland:IPhoneFactory
{
publicoverridevoidCreateN8()
{
System.Console.WriteLine("我是芬兰生产的N8");
}

publicoverridevoidCreateN9()
{
System.Console.WriteLine("我是芬兰生产的N9");
}
}
///<summary>
///手机生产Context
///</summary>
publicclassPhoneFactoryContext
{
IPhoneFactoryphoneFactory=null;
publicPhoneFactoryContext(IPhoneFactory_phoneFactory)
{
this.phoneFactory=_phoneFactory;
}

publicvoidCreateN8()
{
phoneFactory.CreateN8();
}

publicvoidCreateN9()
{
phoneFactory.CreateN9();
}
}

///<summary>
///客户端
///</summary>
voidStrategyTest()
{
PhoneFactoryContextcontext=newPhoneFactoryContext(newPhoneFactory_China());
context.CreateN8();
}
复制代码

优点:
•策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族,并能起到很好的约束作用。
•避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。


缺点:

•每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
•客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

应用情景:
•多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
•需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。   
•对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

转自:http://www.cnblogs.com/ejiyuan/archive/2012/06/26/2564145.html

分享到:
评论

相关推荐

    设计模式-策略模式(Strategy)

    在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

    C#设计模式-吕震宇

    设计模式(22)-Strategy Pattern 设计模式(21)-Template Method Pattern 设计模式(20)-Visitor Pattern 设计模式(19)-Observer Pattern 设计模式(18)-Command Pattern 设计模式(17)-Chain of ...

    design-pattern-java.pdf

    设计模式趣味学习(复习) 设计模式趣味学习(复习) 设计模式与足球(一) 设计模式与足球(二) 设计模式与足球(三) 设计模式与足球(四) 设计模式综合应用实例 设计模式综合应用实例 多人联机射击游戏 多人...

    Strategy-design-pattern-_-model.rar_strategy

    设计模式——策略模式Strategy design pattern _ model

    策略模式 Strategy Pattern

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。...

    java设计模式---诙谐易懂版

    第 1 章 策略模式【Strategy Pattern】 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题, 嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看...

    设计模式之策略模式(Strategy Pattern)

    定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

    设计模式之策略模式(Strategy Pattern)

    NULL 博文链接:https://bossshit.iteye.com/blog/715672

    36种最新设计模式整理

    36种最新设计模式整理 Design Pattern: Simple Factory 模式 Design Pattern: Abstract Factory 模式 Design Pattern: Builder 模式 Design Pattern: Factory Method 模式 Design Pattern: Prototype 模式 ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    C#设计模式.PDF

    设计模式(22)-Strategy Pattern 211 一、 策略(Strategy)模式 211 二、 策略模式的结构 212 三、 示意性源代码 212 四、 何时使用何种具体策略角色 215 五、 一个实际应用策略模式的例子 215 六、 在什么情况下...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    设计模式精解-GoF 23种设计模式解析附C++实现源码 AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    单例模式源码java-DesignPattern:在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在

    在个人自学阶段的23种设计模式代码的全部实现,全部使用Java编写,其中还包括各个设计模式在源码中的使用,每种设计模式都举了一个简单的小例子来进行实现,并加以注释 包名解释 一、DesignPattern 1.1 创建型模式 ...

    设计模式 之 “策略模式[Strategy Pattern]”

    NULL 博文链接:https://lym6520.iteye.com/blog/690554

    C#设计模式大全

    设计模式(22)-Strategy Pattern 一、 策略(Strategy)模式 二、 策略模式的结构 三、 示意性源代码 四、 何时使用何种具体策略角色 五、 一个实际应用策略模式的例子 六、 在什么情况下应当使用策略模式 ...

    33种JAVA设计模式DEMO

    策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    设计模式_策略模式.zip

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 策略模式java-demo 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

Global site tag (gtag.js) - Google Analytics