文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

深入了解Java设计模式之策略模式

2024-04-02 19:55

关注

定义

定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

解决的问题

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

核心要点

把变化的代码从不变的代码中分离出来

针对接口编程而不是具体实现(类)

多用组合/聚合,少用继承

客户端通过组合的方式使用策略

类图

溢出效用

对父类的局部改动,会影响其他部分(子类)、会有溢出效应

策略模式避免使用多重条件语句,比如if-else语句、Swtich语句

缺点:客户端必须知道所有的策略类,并且自行决定使用哪一个策略类。

代码实现

核心接口


public interface Strategy {

    //顶层策略接口
    void Strategy();

}

实现类-三个


public class ConcreteStrategyA  implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法A实现");
    }
}


public class ConcreteStrategyB implements Strategy {
    @Override
    public void Strategy() {
        System.out.println("算法B实现");
    }
}



public class ConcreteStrategyC implements Strategy{

    @Override
    public void Strategy() {
        System.out.println("算法C实现");
    }
}

Context类


public class Context {

    //声明策略接口
    private Strategy strategy;

    //使用聚合的方式
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    
    //提供set方法,支持运行时改变算法
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    //根据具体的策略对象,调用其算法的方法
    public void ContextStrategy(){
        strategy.Strategy();
    }
   
}

Main方法


public class Main
{
    //TODO:代码可以优化,new的具体算法,可以放到配置文件中。
    //运行时读取配置文件
    public static void main(String[] args) {
        Context context;
        //new 一个context对象
        context=new Context(new ConcreteStrategyA());
        context.ContextStrategy();
        
        //运行时改变策略
        context.setStrategy(new ConcreteStrategyB());
        context.ContextStrategy();

        context.setStrategy(new ConcreteStrategyC());
        context.ContextStrategy();
    }

}

拓展

JDK源码

Comparator接口是一个常用的比较器,其中compare()就是一个策略模式的抽象体现

public static void main2(String[] args) {
        Integer[] ints={1,3,8,2,4,9,0};

        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 > o2) {
                    return 1;
                }
                return -1;
            }
        };

        Arrays.sort(ints,comparator);

        System.out.println(Arrays.toString(ints));

 }

Spring源码

Spring的初始化采用了策略模式,即不同类型的类采用不同的初始化策略。

策略模式的注意实现和细节

1)策略模式的关键是 :分析项目中变化部分与不变部分

2)策略模式的核心思想是 :多用组合/聚合,少用继承;用行为类组合,而不是行为的继承。更有弹性。

3)体现了“开闭原则”。客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if … else);

4)提供了可以替换继承关心的办法 :策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。

5)需要注意的是 :每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大。

以上就是深入了解Java设计模式之策略模式的详细内容,更多关于Java策略模式的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯