文档章节

折腾Java设计模式之策略模式

大萌小路
 大萌小路
发布于 01/17 14:11
字数 855
阅读 9
收藏 3

博客原文地址

简介

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简单理解就是一组算法,可以互换,再简单点策略就是封装算法。

意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用 一个系统有许多许多类,而区分它们的只是他们直接的行为。

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

主要角色

  • 上下文Context,拥有一个Strategy的引用
  • 抽象策略Strategy,往往是一个接口(占大部分情况)或者抽象类,通常提供各种具体策略的接口
  • 具体策略,这就是重点了,封装了各种具体的算法

UML

img

应用实例

  • 诸葛亮的锦囊妙计,每一个锦囊就是一个策略;
  • 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略;
  • JAVA AWT 中的 LayoutManager;

优点 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点 1、策略类会增多。 2、所有策略类都需要对外暴露。

使用场景

  1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  2. 一个系统需要动态地在几种算法中选择一种。
  3. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

项目描述

跳转到我的策略模式GitHub

1.操作行为

simple1包,主要对操作行为包装了加减乘除方法。

@Slf4j
public class Application {

    public static void main(String[] args) {
        Context context = new Context(new AddStrategy());
        log.info("10 + 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new SubstractStrategy());
        log.info("10 - 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new MultiplyStrategy());
        log.info("10 * 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new DivideStrategy());
        log.info("10 / 5 = {}", context.executeStrategy(10, 5));
    }
}

执行结果

img

2.出现方式

simple2包描述,主要对出行方式的包装,包装了3种出行方式,

执行类

public class TravelApplication {

    public static void main(String[] args) {
        Context context = new Context(new BusStrategy());
        context.executeStrategy("老王");

        context.setStrategy(new BicycleStrategy());
        context.executeStrategy("老张");

        context.setStrategy(new WalkStrategy());
        context.executeStrategy("老李");
    }
}

执行结果

<u>image-20181222104657926</u>

策略上下文

@Data
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /**
     * 出行
     *
     * @return
     */
    public void executeStrategy(String name) {
        strategy.travel(name);
    }

}

抽象策略

public interface Strategy {

    /**
     * 出现方法
     *
     * @return
     */
    void travel(String name);
}

参考

策略模式

维基里的策略模式

南乡清水的实际项目运用之Strategy模式

© 著作权归作者所有

共有 人打赏支持
大萌小路
粉丝 0
博文 10
码字总数 12467
作品 0
深圳
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
0
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java引用传递和JVM堆栈的关系说明

通过代码说明 Java 引用传递在堆栈上的关系。 可以从JVM的内存空间存放上说明,值传递 和引用传递。 堆(线程共享):对象、对象的全局变量、数组 栈(线程私有):声明为局部变量的 基本数据...

冷基
12分钟前
0
0
直接插入排序

直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。直接插入排序的时间复杂度为O(n^2),但性能比冒泡排序和简单选择排序的性能要好一点...

niithub
13分钟前
0
0
data.world

产品思路: 1、共享数据集。 2、数据结构化。 3、数据展示。 https://data.world

colin_86
43分钟前
2
0
Akka实战:HTTP大文件断点上传、下载,秒传

访问:https://github.com/yangbajing/scala-applications/tree/master/file-upload 获取本文所述完整源码,包括Akka HTTP后端和HTML5实现的前端。 在很多应用里面都会有类似大文件上传的需求...

羊八井
今天
5
0
node:event-loop & 宏任务 & 微任务

event-loop(事件轮询) 代码进入执行栈后会判断当前代码是同步任务还是异步任务,如果是同步任务则会将任务调到主线程同步执行,如果是异步任务则会将任务调到异步队列中。 主线程同步任务执...

小草先森
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部