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种设计模式持续更新汇总中。

相关文章
|
29天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
12天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
22天前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
29 4
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
2月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
49 0
[Java]23种设计模式
|
27天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
85 2
|
2月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
2月前
|
设计模式 Java
Java设计模式
Java设计模式
32 0
|
2月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
32 0