Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式

简介: Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式

【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】

知识回顾:
>

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)---行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】。

策略模式

策略模式核心思想是:在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

策略模式VS状态模式

无论是从代码实现上,还是类图,策略模式和状态模式几乎都一样,但他们本质上是有所不同的,策略模式是完成一件事有不同实现方式,不同的行为;但是状态模式是某一个对象对应的不同状态,总体还是完成一件事,这件事中对应着不同的状态,你可以简单的把它理解为它只有一种策略,这种策略下对应着多种状态。

解决的问题

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

应用策略模式的场景

做同一件事情的不同的行为。

生活中关于策略模式应用的场景

  1. 旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
  2. 会员、普通用户、超级会员等等对应不同的打折策略。
  3. 等等。。。等等。。。。

    生产开发中常用的使用场景

  4. Spring框架中,Resource接口,资源访问策略

  5. 解决一道算法题目的不同策略。
  6. 等等。。。。。等等。。。。

策略模式优点与缺点

优点

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

缺点

  1. 策略类会越来越多,后期不利于管理与维护。
  2. 所有策略类都需要对外暴露,不够安全。

核心角色

定义规则接口的Strategy,实现规则接口策略的具体的类,以及使用某种策略的类Context。

UML类图

image.png

实现代码

我们举这样一个栗子:一场算法竞赛中,有一道题目非常有意思,有多种解法:假设:解法1:暴力法 解法2:双指针 解法3:线段树

接口策略类

package com.strategy;

interface Strategy {
   
   
   void solveProblemDifferentsMethods();
}

具体实现类1

package com.strategy;

class BFStrategy implements Strategy{
   
   

    @Override
    public void solveProblemDifferentsMethods() {
   
   
        // TODO Auto-generated method stub
        System.out.println("这道题目我使用暴力解法解决啦。。。。BFStrategy");
    }

}

具体实现策略类2

package com.strategy;

class TwoPonterStrategy implements Strategy{
   
   

    @Override
    public void solveProblemDifferentsMethods() {
   
   
        // TODO Auto-generated method stub
        System.out.println("这道题目我使用双指针解法解决啦。。。。TwoPonterStrategy");
    }

}

具体实现策略类3

package com.strategy;

class SegmentTreeStrategy implements Strategy{
   
   

    @Override
    public void solveProblemDifferentsMethods() {
   
   
        // TODO Auto-generated method stub
        System.out.println("这道题目我使用线段树解法解决啦。。。。SegmentTreeStrategy");
    }

}

设置使用策略的类

package com.strategy;

class Context{
   
   

    private Strategy strategy;

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

   public void exec(){
   
   
        strategy.solveProblemDifferentsMethods();
   }

}

测试代码

package com.strategy;

public class Main {
   
   

    public static void main(String[] args){
   
   
        Strategy strategy=new BFStrategy();
        Context context=new Context(strategy);
        context.exec();
        System.out.println("方案一暴力法成功解决。。。。。");
        strategy=new TwoPonterStrategy();
        context=new Context(strategy);
        context.exec();
        System.out.println("方案二双指针法成功解决。。。。。");
        strategy=new SegmentTreeStrategy();
        context=new Context(strategy);
        context.exec();
        System.out.println("方案一线段树方法成功解决。。。。。");
    }
}

运行结果展示:

image.png

好了,到这里【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】就结束了,23种设计模式持续更新汇总中。

相关文章
|
18天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
29天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
52 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
251 0
2024年Java秋招面试必看的 | MySQL调优面试题
|
2月前
|
存储 算法 Java
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
铁子,你还记得这些吗----Java基础【拓展面试常问题型】
46 1
|
2月前
|
NoSQL Java 关系型数据库
凭借Java开发进阶面试秘籍(核心版)逆流而上
最近参加了面试或者身边有朋友在面试的兄弟有没有发现,现在的面试不仅会问八股文,还会考察框架、项目实战、算法数据结构等等,需要准备的越来越多。 其实面试的时候,并不是要求你所有的知识点都会,而是关键的问题答到点子上!这份《Java 开发进阶面试秘籍(核心版)》由 P8 面试官整体把控,目前已经更新了 30 万字! 资料中涵盖了一线大厂、中小厂面试真题,毕竟真题都是技术领域最经典的基础知识和经验沉淀的汇总,非常有必要学习掌握!双重 buff 叠加,offer 接到手软~ 点击此处取,这可能是你到目前为止领取的最具含金量的一份资料! 整套资料涵盖:Spring、Spring
|
2月前
|
存储 缓存 Java
面试官:什么是Java内存模型?
面试官:什么是Java内存模型?
112 0
面试官:什么是Java内存模型?
|
1月前
|
消息中间件 NoSQL 网络协议
Java面试知识点复习​_kaic
Java面试知识点复习​_kaic
|
3天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
31 1
|
3天前
|
设计模式 搜索推荐 Java
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
12 0
|
19天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0