`
gaojingsong
  • 浏览: 1155010 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

【策略模式】的故事来源(StrategyPattern)

阅读更多
策略模式(Strategy),又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式中有三个对象:
(1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)抽象策略对象:它可由接口或抽象类来实现。
(3)具体策略对象:它封装了实现同不功能的不同算法。
利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
 
故事一话说天下大势分久必合合久必分
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列,还想着娶纯情少女的,色咪咪的刘备老爷子去江东,多亏小亮同志的妙计
还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的。
先说这个场景中的要素:三个妙计,一个锦囊,一个赵云,妙计是小亮同志给的,妙计是放置在锦囊里,俗称就是锦囊妙计嘛,那赵云就是一个干活的人,从锦囊中取出妙计,执行,然后获胜
锦囊妙计
计谋一:找乔国老帮忙,使孙权不能杀刘备
计谋二:金钱贿赂,求吴国太开个绿灯,放行
计谋三:孙夫人断后,挡住追兵
 
故事二:
贩卖各类书籍的电子商务网站的购物车系统。可能对所有的高级会员提供每本20%的促销折扣;对中级会员提供每本10%的促销折扣;对初级会员没有折扣。根据描述,折扣是根据以下的几个算法中的一个进行的:
折扣优惠算法:
算法一:对初级会员没有折扣。
算法二:对中级会员提供10%的促销折扣。
算法三:对高级会员提供20%的促销折扣。
 
故事三:
过年回家:我们可以有几个策略可以考虑:可以自己驾车,去汽车站乘汽车,坐火车,坐飞机。最终的目标都相同:回到家中
每个策略都可以得到相同的结果:回家,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。
回家交通工具选择:
选择一:自己驾车
选择二:去汽车站乘汽车
选择三:坐火车
选择四:坐飞机
 
策略模式仅仅封装算法,提供新的算法插入到已有系统中,以及老算法从系统中“退休”的方法,策略模式并不决定在何时使用何种算法。在什么情况下使用什么算法是由客户端决定的。
策略模式的重心
  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
  策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
  运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
 
/**
 回家交通工具选择
 */
public interface GoHomeMethod{
   public void goHome();
}
 
/**
1:乘坐飞机 
 */  
public class GoHomeByAirPlanelStrategy implements GoHomeMethod {  
    public void goHome(){  
        echo("goHome by AirPlain");   
    }  
}  
 
/**
2:乘坐火车 
 */  
public class GoHomeByTrainStrategy  implements GoHomeMethod {  
    public void goHome(){  
        echo("goHome by Train");   
    }  
 
** 
 * 环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。 
 * 算法解决类,以提供客户选择使用何种解决方案: 
 */  
class PersonContext{  
    private GoHomeMethod  goHomeMethod= null;  
  
    public PersonContext(goHomeMethod goHomeMethod){  
        this.goHomeMethod = goHomeMethod;  
    } 
    
    /** 
    * 回家选择方式(和构造方法等价)
    */  
    public function setGoHomeMethod(goHomeMethod goHomeMethod){  
        this.goHomeMethod = goHomeMethod; 
    } 
    
    /** 
    * 回家
    */  
    public void goHome(){  
        return this.goHomeMethod.goHome();  
    }  
}   
 
public class Test{
   public static void main(String args[]){
   
   //乘坐飞机  
   PersonContext personContext = new PersonContext(new GoHomeByAirPlanelStrategy());  
   personContext.goHome();  
  
    //改骑乘坐火车  
    personContext.setGoHomeMethod(new GoHomeByTrainStrategy());  
    personContext.goHome();
   }
}
0
0
分享到:
评论

相关推荐

    设计模式--策略模式StrategyPattern

    设计模式--策略模式StrategyPattern

    策略模式StrategyPattern

    策略模式StrategyPattern,通过实现鸭子的飞行策略以及叫声策略演示策略模式的具体实现!

    StrategyPattern

    定义了算法族,分别封装起来,让它们之间可以相互替代,此模式让算法的变化独立于使用算法的客户。

    【设计模式】策略模式

    以和平精英的特种作战模式为例,无论是工程兵还是医疗兵,都有射击这个行为,此外这些兵种都有一项特殊技能,但不知道具体行为,比如建盾牌、治疗等,可以选择在特殊技能上应用策略模式,之后如需修改具体技能只需...

    深入浅出设计模式(中文版)

    5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10...

    深入浅出设计模式(中文版电子版)

    5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10...

    实验四StrategyPattern

    利用策略模式在排序对象中封装不同的排序算法(包括冒泡排序、快速排序、合并排序等),用户输入一系列的数据,或从文件中读入所需数据, 输入数据类型的存储可结合泛型编程, 然后允许客户动态地选择上述某一种排序...

    Java设计模式学习教程与案例源码.zip

    1. [策略模式](worthed/OriginBlog/blob/master/articles/StrategyPattern.md) 2. [模板方法](worthed/OriginBlog/blob/master/articles/TemplateMethodPattern.md) 3. [状态模式](worthed/OriginBlog/blob/master...

    C#23种设计模式

    21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern) 工程结构 ├─01.Singleton │ ├─html │ └─MySingleton │ ├─bin │ │ └─Debug │ ├─obj │ │ └─...

    设计模式之行为模式(一)

    本资源是用VC6.0实现的行为模式,有八种:CommandPattern、MediatorPattern、MementoPattern、ObserverPattern、StatePattern、StrategyPattern、TemplatePattern、VisitorPattern。参考于《23种设计模式(C++).pdf》

    StrategyStateGenerator:Java中策略和/或状态模式代码的生成器-开源

    *状态模式*和*策略模式*在技术上是相同的(请参阅[设计模式](http://c2.com/cgi/wiki?StrategyPattern))。 因此,祖先项目[Strategy Generator](https://sourceforge.net/projects/strategygenerator/)已被...

    02_StrategyPattern 商场促销

    NULL 博文链接:https://rich8w.iteye.com/blog/450419

    strategyPattern:软件设计

    策略模式 软件设计 作者亚历杭德罗·贝拉斯科镜

    常用设计模式的IOS实现源码打包下载

    AbstractFactoryPattern AdapterPattern IBridgePattern IBuilderPattern ChainOfResponsibilityPatte 日CommandPattern ICompositePattern IDecoratorPattern ...StrategyPattern TemplatePattern VisitorPattern

Global site tag (gtag.js) - Google Analytics