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

Java 设计模式之【策略】学习与掌握,第1张

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

文章目录
  • 前言
  • 定义
  • 优点
  • 缺点
  • 模式的结构与实现
    • 模式的结构
    • 模式的实现
  • 应用场景

前言

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

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

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

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


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

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


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

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

模式的结构与实现

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

模式的结构

角色如下:

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

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


public interface AbsStrategy {

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

}

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


public class Iml1Strategy implements AbsStrategy{
    @Override
    public void sort() {
        System.out.println(":> 排序使用选择算法");
    }
}

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


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();
    }

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


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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5075501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存