Java 设计模式之策略学习与掌握

Posted 邹奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 设计模式之策略学习与掌握相关的知识,希望对你有一定的参考价值。

前言

个人建议设计模式这一系列的文章,多关注定义模式的代码实现

至于模式结构和扩展或者是应用场景,基本了解过一下就好,没必要硬记。

这只是我的个人建议,同学们当然可以自己选择知识消化。

鲁迅曾说过:对代码相关的概念,如果理解不了,就狠狠的实践它吧!实践的多了,就自然懂了。


定义

  • 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。


优点

  • 可以避免使用多重条件语句
  • 提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。
  • 提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法。
  • 把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。

缺点

  • 具体策略类多的时候,会增加一定程度的维护难度。
  • 客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类。

模式的结构与实现

不同的具体策略类有不同的算法实现,当然实现的是同一目标。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。

模式的结构

角色如下:

  • 【抽象策略类】定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。
  • 【具体策略类】实现了抽象策略定义的接口,提供具体的算法实现。
  • 【环境类】持有对策略类的引用,提供给客户端调用。

模式的实现

  • 【抽象策略类】,代码如下:
package com.example.designmodedemo.principle.strategy;

/**
 * 抽象策略
 */
public interface AbsStrategy {

    // 定义排序方法
    void sort();

}

  • 【具体策略类 1】,代码如下:
package com.example.designmodedemo.principle.strategy;

/**
 * 具体策略类1,实现抽象策略接口
 * 使用选择算法实现排序
 */
public class Iml1Strategy implements AbsStrategy{
    @Override
    public void sort() {
        System.out.println(":> 排序使用选择算法");
    }
}

  • 【具体策略类 2】,代码如下:
package com.example.designmodedemo.principle.strategy;

/**
 * 具体策略类2,实现抽象策略接口
 * 使用冒泡算法实现排序
 */
public class Iml2Strategy implements AbsStrategy{
    @Override
    public void sort() {
        System.out.println(":> 排序使用冒泡算法");
    }
}

  • 【环境类】,代码如下:
package com.example.designmodedemo.principle.strategy;

/**
 * 环境类
 * 持有策略类的引用,提供给客户端调用
 */
public class MyContext {

    private AbsStrategy absStrategy;

    public AbsStrategy getAbsStrategy() {
        return absStrategy;
    }

    public void setAbsStrategy(AbsStrategy absStrategy) {
        this.absStrategy = absStrategy;
    }

    public void sort(){
        absStrategy.sort();
    }

}

  • 【客户端】,调用代码如下:
	/**
     * 策略模式
     */
    private void principle_strategy() {
        MyContext myContext = new MyContext();
        myContext.setAbsStrategy(new Iml1Strategy());
        myContext.sort();
        System.out.println(":> --- 使用新算法 ---");
        myContext.setAbsStrategy(new Iml2Strategy());
        myContext.sort();
    }

-【运行结果】,如下图示:


应用场景

  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
  • 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到具体策略类中。
  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。

技术永不眠!我们下期见!

以上是关于Java 设计模式之策略学习与掌握的主要内容,如果未能解决你的问题,请参考以下文章

Java 设计模式之状态学习与掌握

Java 设计模式之状态学习与掌握

Java 设计模式之状态学习与掌握

Java 设计模式之模板方法学习与掌握

Java 设计模式之模板方法学习与掌握

阅读与感悟-如何高效学习