zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

      策略模式,属于行为型设计模式,用于在运行时更改一个类的行为或其算法。

      定义:定义一系列算法类,将每一个算法封装起来,并让它们可以相互转换,让算法独立于使用它的客户而变化。

      问题描述:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护的问题。

      解决方案:将这些算法封装成一个一个的类,任意地替换。

      结构图

      举个栗子:将一个电影票折扣的故事。。。

      电影院中,电影票针对不同的人群有不同的优惠,比如团购票会优惠十元,学生票是八折,儿童票半价和VIP票是四折等,不同的优惠就是不同的策略,我们可以使用策略模式对电影院打折方案进行实现,具体实现方式如下:

      1. 新建一个抽象策略类Discount,它是一个接口,声明了一个打折方法。代码如下:

              

      2. 分别新建上述不同的具体策略类,均实现接口中声明的方法。代码如下:

              

      其他具体策略类相同,略。

      3. 新建一个电影票类MovieTicket,它持有一个对抽象策略类Discount的实例的引用。代码如下:

              

      4. 使用策略模式,实现电影院针对不同人群的打折方案。代码如下:

              

      5. 运行后的效果,如下:

             

      以上可知,如果需要新增新的打折方式,我们无需修改原代码,只要增加一个新的折扣类作为抽象折扣类的子类,实现在抽象折扣类中声明的打折方法,将原有的具体折扣类替换成新的折扣类即可,完全符合开闭原则。

      优点

      1. 符合开闭原则;

      2. 提供了管理相关的算法族的方法;

      3. 避免了多重条件选择语句。

      缺点

      1. 会产生很多具体的策略类,增加设计和维护的难度;

      2. 无法同时使用多个策略类,只能使用其中的一种策略。

      3. 使用者必须知道所有的策略类,并自行决定使用哪一个策略类。

      适用场景

      1. 当一个系统需要动态地决定在几种算法中选择其中一种使用时;

      2. 当一个对象有很多行为时,可以使用策略模式将这些行为转移到相应的具体策略类里,避免使用难以维护的多重条件选择语句。

  • 相关阅读:
    使用netcraft在线查看网站使用的操作系统和服务器
    Terracotta Web Sessions Tutorial
    JPA2.0和Spring的集成配置方式
    Maven笔记(5) Eclipse和Maven集成
    Maven笔记(2) 常用命令和标准的Maven项目结构
    Maven笔记(4) 构建一个Web Project
    Linux 技巧:让进程在后台可靠运行的几种方法
    You are currently running the HMaster without HDFS append support enabled. This may result in data loss. Please see the
    xtrabackup 安装及应用
    CentOS 6.2 X64上64位Oracle11gR2 静默安装,静默设置监听,静默建库亲自实践记录
  • 原文地址:https://www.cnblogs.com/chenxkang/p/6813408.html
Copyright © 2011-2022 走看看