谈谈java设计模式之策略模式

来源:互联网 发布:数据库主键生成策略 编辑:程序博客网 时间:2024/06/01 21:03

前言

java有很多种设计模式,如果能在实际的应用场景中熟练得运用一些恰当的设计模式,有助于我们的系统在建设过程中实现组件松耦合,增强扩展性和可维护性,同时适当运用一些设计模式也能增强我们代码的可读性,让别人很容易上手我们写的代码。总之设计模式是我们软件工程中一个重要的灵魂,有了它我们才能建设出卓越的系统。呵呵,以上说了不少废话,我想要表达的是后面我会不定期写一些关于设计模式的文章,而今天我们主要聊聊策略模式。

策略模式是什么?

策略模式是属于对象的行为型模式。呵呵,这是比较经典简洁的概念描述,你可能听后还很懵逼,没事,这很正常,如果这个概念这么几句话就描述清楚了,后面我就不必再说了不是,且听后面更详细的剖析。策略模式,它像行为模式一样封装了许多算法或者行为,这些算法都是为了做同一件事,只是它们所使用的策略不一样;在运行的时候动态的根据实际的环境和条件再确定的使用哪一种算法。只是策略模式运用了java的继承多态性,它把算法抽象出来为一个抽象策略类,而算法本身再被封装到各个具体的实现类中。这使得在不影响使用算法的客户端的情况下,使得它们可以相互替换。

策略模式组成结构

再来揭露一下本质:策略模式实质是对算法的封装,它把使用算法的责任和算法本身分割开来,而算法本身委托给不同的对象来管理。为了更好理解这段话,我们会谈到策略模式组成的三个重要角色:

  1. 环境(context)角色:持有strategy的引用
  2. 抽象策略(Strategy)角色:各种不同算法的抽象接口
  3. 具体策略(Strategy)角色:包装了具体的算法或者行为
    说明:环境角色是算法使用者,但具体策略角色对它来说是透明的,它只需要面向抽象策略角色,使用的具体算法由策略对象决定

策略模式PS

策略模式侧重点:

策略模式侧重点不在如果实现算法,而在于如果组织及调用这些算法,它使得我们以更优雅的方式来决定我们使用哪一种算法,使得我们程序结构更灵活,具有更好的扩展性和可维护性。

算法平等性

策略模式也并不针对具体某一个算法,它侧用各个算法之间如果更优雅的去相互替换,所以策略算法之间是平等的,也没有相互依赖之说。

运行时策略唯一性

策略模式在同一时刻只能使用一种算法,虽然可以动态切换算法,但同一时刻只能使用一个!

策略模式优点

  1. 策略模式核心毫无疑问是对各种算法进行了很好的组织和调用,各种不同的算法的公共部分可以提取到父类即抽象策略类中,避免了代码的冗余重复,增强了代码内聚和可维护性。
  2. 避免了多重条件语句(if-else)的使用,多重条件语句导致算法的定义和使用混淆在一起,造成逻辑的紧耦合,不便于扩展和维护。

策略模式缺点

  1. 客户端需要知道所有可用的策略类,以自行决定使用哪一种算法;这意味着客户端需要了解不同算法的区别,以决定选用哪一个算法
  2. 策略模式使用了很多具体算法实现类,如果涉及使用到的算法越多会产生越多的具体策略对象
原创粉丝点击