当前位置: 首页 > news >正文

java2025年常见设计模式面试题

1. 请解释建造者模式(Builder Pattern)及其应用场景。

答案
建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。
示例

public class Car {
    private String engine;
    private String wheels;
    private String color;

    public Car(String engine, String wheels, String color) {
        this.engine = engine;
        this.wheels = wheels;
        this.color = color;
    }

    @Override
    public String toString() {
        return "Car{" +
                "engine='" + engine + '\'' +
                ", wheels='" + wheels + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}

public class CarBuilder {
    private String engine;
    private String wheels;
    private String color;

    public CarBuilder setEngine(String engine) {
        this.engine = engine;
        return this;
    }

    public CarBuilder setWheels(String wheels) {
        this.wheels = wheels;
        return this;
    }

    public CarBuilder setColor(String color) {
        this.color = color;
        return this;
    }

    public Car build() {
        return new Car(engine, wheels, color);
    }
}

// 使用
Car car = new CarBuilder()
          .setEngine("V8")
          .setWheels("Alloy")
          .setColor("Red")
          .build();
System.out.println(car);

应用场景

  • 当对象的构建过程复杂,且需要逐步设置多个属性时。
  • 当对象的构建逻辑可能变化时,使用建造者模式可以灵活调整。

2. 请解释适配器模式(Adapter Pattern)及其应用场景。

答案
适配器模式用于将一个类的接口转换为客户期望的另一个接口,从而使原本不兼容的接口能够一起工作。
示例

public interface MediaPlayer {
    void play(String audioType, String fileName);
}

public interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing VLC file: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        throw new UnsupportedOperationException();
    }
}

public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing MP4 file: " + fileName);
    }
}

public class MediaAdapter implements MediaPlayer {
    private AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        }
    }
}

// 使用
MediaPlayer player = new MediaAdapter("vlc");
player.play("vlc", "sample.vlc");

应用场景

  • 当需要将第三方库或遗留代码集成到现有系统中时。
  • 当需要扩展系统的功能,但不想修改现有代码时。

3. 请解释代理模式(Proxy Pattern)及其应用场景。

答案
代理模式提供了一种代理对象,该对象内部含有对真实对象的引用,通过代理对象来间接访问真实对象,从而在不改变真实对象代码的情况下,添加一层间接层来控制对真实对象的访问。
示例

public interface Image {
    void display();
}

public class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    private void loadFromDisk(String fileName) {
        System.out.println("Loading " + fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }
}

public class ProxyImage implements Image {
    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

// 使用
Image image = new ProxyImage("test.jpg");
image.display();

应用场景

  • 当需要延迟加载资源时(如图片)。
  • 当需要控制对对象的访问时(如权限检查)。

4. 请解释模板方法模式(Template Method Pattern)及其应用场景。

答案
模板方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。
示例

public abstract class Game {
    protected abstract void initialize();
    protected abstract void startPlay();
    protected abstract void endPlay();

    public final void play() {
        initialize();
        startPlay();
        endPlay();
    }
}

public class Cricket extends Game {
    @Override
    protected void initialize() {
        System.out.println("Cricket game initialization");
    }

    @Override
    protected void startPlay() {
        System.out.println("Cricket game started");
    }

    @Override
    protected void endPlay() {
        System.out.println("Cricket game finished");
    }
}

public class Football extends Game {
    @Override
    protected void initialize() {
        System.out.println("Football game initialization");
    }

    @Override
    protected void startPlay() {
        System.out.println("Football game started");
    }

    @Override
    protected void endPlay() {
        System.out.println("Football game finished");
    }
}

// 使用
Game game = new Cricket();
game.play();

应用场景

  • 当多个子类共享相同的算法结构,但某些步骤需要根据子类不同而变化时。
  • 当需要定义算法的骨架,但允许子类灵活实现某些步骤时。

5. 请解释门面模式(Facade Pattern)及其应用场景。

答案
门面模式提供了一个统一的高层接口,用于访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。
示例

public class SubSystemA {
    public void methodA() {
        System.out.println("SubSystemA methodA");
    }
}

public class SubSystemB {
    public void methodB() {
        System.out.println("SubSystemB methodB");
    }
}

public class SubSystemC {
    public void methodC() {
        System.out.println("SubSystemC methodC");
    }
}

public class Facade {
    private SubSystemA a;
    private SubSystemB b;
    private SubSystemC c;

    public Facade() {
        a = new SubSystemA();
        b = new SubSystemB();
        c = new SubSystemC();
    }

    public void operation() {
        a.methodA();
        b.methodB();
        c.methodC();
    }
}

// 使用
Facade facade = new Facade();
facade.operation();

应用场景

  • 当需要简化一个复杂子系统的使用时。
  • 当需要提供一个统一的接口,隐藏子系统的复杂性时。

文章转载自:

http://du8oWCEu.wyzby.cn
http://I5N3RRXa.wyzby.cn
http://7lVWshuW.wyzby.cn
http://OoarAshL.wyzby.cn
http://d9tboDUl.wyzby.cn
http://N1itlp6O.wyzby.cn
http://Ql7vWqeL.wyzby.cn
http://2kyKtoex.wyzby.cn
http://hsY783Ig.wyzby.cn
http://hhR24JNl.wyzby.cn
http://rFmVeoc9.wyzby.cn
http://UM7h2QhX.wyzby.cn
http://QQECLzq2.wyzby.cn
http://fehHBjQb.wyzby.cn
http://FZG8nlDf.wyzby.cn
http://ZcTpuFWr.wyzby.cn
http://cQg7uYv3.wyzby.cn
http://NMSVUKaA.wyzby.cn
http://B8HjYE3B.wyzby.cn
http://C0tvpsIS.wyzby.cn
http://fD4IiBOI.wyzby.cn
http://zq7QWv2S.wyzby.cn
http://n3NagauA.wyzby.cn
http://9Tgtyf7u.wyzby.cn
http://psRCeGEZ.wyzby.cn
http://dl3zB2HH.wyzby.cn
http://lqsU5Tn3.wyzby.cn
http://WoPqcJuw.wyzby.cn
http://NZKlv4sJ.wyzby.cn
http://BjhewBxb.wyzby.cn
http://www.dtcms.com/a/57388.html

相关文章:

  • 我的三维引擎独立开发之路:坚持与迷茫
  • 通领科技冲刺北交所
  • 计算机网络:计算机网络的概念
  • 【JavaScript】09-构造函数+数据常用函数
  • Node.js原型链污染
  • 大数据_数仓建模_八股
  • 开源项目介绍:Native-LLM-for-Android
  • mitt 依赖库详解
  • 安徽省考计算机专业科目2025(持续更新)
  • SpringCloud—概述—01
  • 人工智能之数学基础:正交矩阵
  • React封装通用Form组件,类型转换、命名控件样式隔离、支持表单验证、位置自定义、自定义布局、提示信息info等功能。未采用二次封装调整灵活,包含使用文档
  • xxx **5. 物理安全** 详细解读
  • 新能源汽车能量管理:开启绿色出行新动力
  • 常见的 Git 命令
  • UV,纹理,材质,对象
  • Python----数据分析(Matplotlib四:Figure的用法,创建Figure对象,常用的Figure对象的方法)
  • MES机联网4:文档资料
  • MySQL中的脏读与幻读:概念、影响与解决方案
  • 进程模型2-进程优先级
  • 类和对象:
  • kafka消息中间件的rebalance机制
  • 介绍一下Qt中的事件过滤
  • Array and string offset access syntax with curly braces is deprecated
  • 《探秘课程蒸馏体系“三阶训练法”:解锁知识层级递进式迁移的密码》
  • ESP32 UART select解析json数据,上位机控制LED灯实验
  • 如何提取图片文字
  • 高性能算法NGO!北方苍鹰优化算法(Northern Goshawk Optimization,NGO)
  • 解决JDK 序列化导致的 Redis Key 非预期编码问题
  • 手写简易Tomcat核心实现:深入理解Servlet容器原理