设计模式学习笔记——策略模式

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 11:29 点击:

策略模式

属于对象的行为模式,是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得他们之间可互相替换。

策略模式使得算法可以在不影响到客户端的情况下发生变化。

 

策略模式是对算法的包装,把使用算法的责任和算法本身分离,委派给不同对象管理。

 

策略模式涉及到的角色:

环境角色Context:持有Strategy类的引用

抽象策略角色Strategy:抽象角色,由接口或抽象类实现,给出统一算法接口

具体策略角色ConcreteStrategy:具体的算法实现

 

搬运过来的类图一枚

 

 

从代码上来看策略模式相当简单,甚至可以免去解释,下面是各个类的实现

首先是抽象接口Strategy

Java代码

public interface Strategy { 

    public void strategyInterface(); 

 

接下来是具体策略类,这里实现2个,只是打印一句话

Java代码

public class ConcreteStrategy implements Strategy{ 

    @Override 

    public void strategyInterface() { 

        System.out.println("first strategy"); 

    } 

 

public class ConcreteStrategy2 implements Strategy{ 

    @Override 

    public void strategyInterface() { 

        System.out.println("second strategy"); 

    } 

 

再者是环境角色,持有一个策略类的引用

Java代码

public class Context { 

    private Strategy strategy; 

     

    public Context(Strategy strategy){ 

        this.strategy=strategy; 

    } 

     

    public void contextInterface(){ 

        strategy.strategyInterface(); 

    } 

 

最后来看策略模式达到的效果

Java代码

public class StrategyPattern { 

    public static void main(String[] args) { 

        Context context1=new Context(new ConcreteStrategy()); 

        Context context2=new Context(new ConcreteStrategy2()); 

         

        context1.contextInterface(); 

        context2.contextInterface(); 

    } 

 

输出结果

first strategy

second strategy

 

上面的策略模式应该说是最最简单的,在书中还提到了策略模式在实现过程中需要注意的地方

1 具体策略角色有公共的行为或者属性 这个情况还是比较多的 此时应该将上面的Strategy从接口改为抽象类

2 策略模式在同一时间只能使用一个策略对象,但一个应用程序可能需要与多个策略相关联。也就是说,应用程序启动的时候,策略对象应该已经被创立,从而实现切换。

 

策略模式的使用时机:

1 系统中有许多类,而他们之间的区别只是行为

2 系统需要动态选择几种算法,则将算法包装起来

3 系统算法使用的数据不能让客户端知道

4 一个对象有多种行为,只能使用多重if...else语句实现

 

策略模式的优缺点

优点

1 提供了管理相关算法族的方法。适当使用继承可以把公共代码转移到父类,避免重复代码

2 策略模式提供了替换继承关系的办法。

3 避免了多重条件判断

缺点

1 客户端必须知道所有的策略类,并自行决定使用哪个。

2

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • 浅析.NET下XML数据访问新机制
      • asp.net 面试+笔试题目第1/2页
      • C# 邮件地址是否合法的验证
      • asp.net 设置GridView的选中行的实现代码
      • C#高级编程:数据库连接[1]
      • 经典C++程序1
      • IIS 自动回收导致后台定时器失效的问题解决
      • ASP.NET GridView列表代码示例
      • Asp.net MVC源码分析--Action Filter的链式调用
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1