整理好了!2024年最常见 20 道设计模式面试题(三)

上一篇地址:整理好了!2024年最常见 20 道设计模式面试题(二)-CSDN博客

五、适配器模式是如何工作的?请举例说明。

适配器模式(Adapter Pattern)是一种常用的设计模式,属于结构型模式之一。它主要用于解决两个不兼容接口之间的问题,使得原本因接口不兼容而不能一起工作的类可以协同工作。适配器模式通常包含以下几个角色:

  1. 目标(Target):定义客户端使用的特定领域相关的接口。
  2. 适配者(Adaptee):一个已经存在的类,需要适配。
  3. 适配器(Adapter):通过在内部包装一个Adaptee对象,把源接口转换成目标接口。

工作原理:

适配器模式的工作原理是创建一个中间层(适配器),这个中间层将不兼容的接口转换成客户端期望的接口。适配器模式让原本因接口不兼容而不能一起工作的类可以协同工作。

举例说明:

假设我们有一个第三方库,它提供了一个MediaPlayer接口,该接口有一个play方法,用于播放音频。但是,我们手头有一个旧的音频播放类OldAudioPlayer,它有一个playAudio方法,而不是play方法。现在,我们想要使用OldAudioPlayer来播放音频,但是它不符合MediaPlayer接口的要求。

为了解决这个问题,我们可以创建一个适配器AudioPlayerAdapter,它实现了MediaPlayer接口,并在其内部持有一个OldAudioPlayer的实例。当调用AudioPlayerAdapterplay方法时,它会调用内部OldAudioPlayerplayAudio方法,从而实现接口的适配。

// 目标接口
interface MediaPlayer {
    void play();
}

// 旧的音频播放类
class OldAudioPlayer {
    public void playAudio() {
        System.out.println("Playing audio using OldAudioPlayer");
    }
}

// 适配器类
class AudioPlayerAdapter implements MediaPlayer {
    private OldAudioPlayer oldAudioPlayer;

    public AudioPlayerAdapter(OldAudioPlayer oldAudioPlayer) {
        this.oldAudioPlayer = oldAudioPlayer;
    }

    @Override
    public void play() {
        oldAudioPlayer.playAudio();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        OldAudioPlayer oldAudioPlayer = new OldAudioPlayer();
        MediaPlayer mediaPlayer = new AudioPlayerAdapter(oldAudioPlayer);
        mediaPlayer.play(); // 通过适配器调用旧的播放方法
    }
}

在这个例子中,AudioPlayerAdapter充当了适配器的角色,它使得OldAudioPlayer能够以MediaPlayer接口的形式被使用。这样,我们就可以在不修改原有代码的情况下,让旧的类与新的接口兼容。

六、什么是观察者模式?它在实际应用中有哪些用途?

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统。

观察者模式的主要角色:

  1. 主题(Subject):也称为被观察者,它维护一组观察者,提供注册、注销和通知观察者的方法。
  2. 观察者(Observer):定义了一个更新接口,用于在得到主题通知时更新自己。
  3. 具体主题(ConcreteSubject):实现抽象主题中的方法,维护当前状态,当状态发生改变时,通知所有观察者。
  4. 具体观察者(ConcreteObserver):实现观察者接口,存储与主题相关的状态,实现更新接口。

工作原理:

  1. 观察者模式中的主题维护一个观察者列表。
  2. 当主题的状态发生变化时,它会通知列表中的所有观察者。
  3. 观察者接收到通知后,会调用自己的更新方法,以响应主题状态的变化。

实际应用中的用途:

  1. 用户界面(UI)更新:在图形用户界面中,当模型数据发生变化时,界面需要相应地更新。观察者模式可以用于实现数据和视图之间的自动同步。

  2. 事件监听:在事件驱动的系统中,事件的发布者(主题)可以注册多个监听者(观察者),当事件发生时,所有监听者都会收到通知。

  3. 消息推送系统:在消息推送系统中,服务端(主题)可以向多个客户端(观察者)推送消息,当有新消息时,所有客户端都会收到通知。

  4. 股票市场监控:在股票交易系统中,股票价格的变化可以作为主题,而投资者、交易算法等可以作为观察者,当股票价格变动时,所有相关方都会得到通知。

  5. 网络通信:在网络通信中,服务器(主题)可以向多个客户端(观察者)发送数据更新,当数据发生变化时,所有客户端都会收到更新。

示例代码(Java):

// 观察者接口
interface Observer {
    void update(String message);
}

// 主题接口
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

// 具体主题
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0) {
            observers.remove(i);
        }
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

    public String getState() {
        return state;
    }
}

// 具体观察者
class ConcreteObserver implements Observer {
    private ConcreteSubject subject;

    public ConcreteObserver(ConcreteSubject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String message) {
        System.out.println("Observer: " + message);
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer1 = new ConcreteObserver(subject);
        ConcreteObserver observer2 = new ConcreteObserver(subject);

        subject.setState("State1");
        subject.removeObserver(observer1);
        subject.setState("State2");
    }
}

在这个示例中,ConcreteSubject是具体的主题,它维护了一个观察者列表,并在状态变化时通知所有观察者。ConcreteObserver是具体观察者,实现了Observer接口,当接收到通知时,会打印消息。客户端代码创建了主题和观察者,并演示了状态更新和观察者注册/注销的过程。

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值