返回

探索 Java 中的行为型设计糋,共筑靈活、可複用代碼

后端

航行于代码海洋的指明灯:行为型设计模式

作为一名 Java 开发人员,我们不断努力构建坚固耐用的软件系统,在浩瀚的代码海洋中航行。在这个过程中,设计模式犹如航海中的航标,指引着我们穿越波涛汹涌的代码,搭建起稳固的系统架构。

在设计模式的殿堂中,行为型设计模式扮演着重要的角色。它们专注于对象之间的交互和关系,提供灵活、可复用的解决方案,帮助我们应对复杂系统中的挑战。

策略模式:灵活演算法的指挥家

想象一下一个交响乐团,指挥家协调着不同的乐器,演绎出美妙的旋律。策略模式就像这个指挥家,它协调着不同的算法,实现相似的任务,提供更灵活的解决方案。其灵活性在于,算法的变更与客户端程序无关,只需变更相应的策略,即可轻松实现算法的切换。

策略模式的主要优点:

  • 灵活性: 策略模式提供灵活的算法切换,使系统能够适应不同的需求和环境。
  • 可复用性: 策略模式可将通用算法提取出来,以方便重用,避免重复程序代码的开发。
  • 解耦合: 策略模式将算法与客户端程序解耦合,使两**者可以独立变更,降低变更带来的影响。

一个典型的策略模式应用场景是购物网站中的付款选项。系统可提供多种付款选项,如在线银行、电子钱包等,用户可依个人偏好选择相应的策略进行付款。

interface PaymentStrategy {
    void pay(double amount);
}

class OnlineBankingStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // Implement online banking payment logic
    }
}

class WalletStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // Implement wallet payment logic
    }
}

class ShoppingCart {
    private List<Item> items;
    private PaymentStrategy paymentStrategy;

    public ShoppingCart() {
        this.items = new ArrayList<>();
    }

    public void addItem(Item item) {
        items.add(item);
    }

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout() {
        double totalAmount = 0;
        for (Item item : items) {
            totalAmount += item.getPrice();
        }
        paymentStrategy.pay(totalAmount);
    }
}

观察者模式:新闻社的订阅系统

观察者模式犹如新闻社的订阅系统,使多个对象能够同时监听某一对象的变更。一旦对象的属性或行为发生变更,系统便会通知这些观察者,并让它们做出相应的动作。

观察者模式的主要优点:

  • 松散耦合: 观察者与可观察对象之间保持松散耦合,降低变更带来的影响。
  • 通知多个对象: 观察者模式允许多个对象同时监听某一对象的变更,并在变更时通知它们。
  • 扩展性强: 观察者模式易于扩展,只需新增观察者对象即可,而无需变更可观察对象的接口。

观察者模式的经典应用场景之一,即桌面上显示温度的程序。程序中包含温度传感器对象和显示温度界面对象,当温度传感器对象检测到温度的变更时,便会通知显示温度界面对象进行相应的变更。

interface TemperatureObservable {
    void registerObserver(TemperatureObserver observer);
    void removeObserver(TemperatureObserver observer);
    void notifyObservers();
}

class TemperatureSensor implements TemperatureObservable {

    private List<TemperatureObserver> observers = new ArrayList<>();
    private double temperature;

    public void setTemperature(double temperature) {
        this.temperature = temperature;
        notifyObservers();
    }

    @Override
    public void registerObserver(TemperatureObserver observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(TemperatureObserver observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (TemperatureObserver observer : observers) {
            observer.update(temperature);
        }
    }
}

interface TemperatureObserver {
    void update(double temperature);
}

class TemperatureDisplay implements TemperatureObserver {

    @Override
    public void update(double temperature) {
        // Display the temperature on the screen
    }
}

迭代器模式:探索集合的向导

迭代器模式宛若探险队中的向导,引领客户端程序逐一遍历集合中的对象,而无需将整个集合载入内存中。此模式提供一种统一的方法来访问集合中的对象,并使客户端程序能够方便地遍历整个集合。

迭代器模式的主要优点:

  • 统一访问: 迭代器模式提供统一的方法来访问集合中的对象,使客户端程序能够以一致的方式处理不同的集合类型。
  • 延迟载入: 迭代器模式仅在需要时才载入集合中的对象,而非将整个集合载入内存中,从而节省内存空间并提高效率。
  • 解耦合: 迭代器模式将集合与客户端程序解耦合,使两**者可以独立变更,降低变更带来的影响。

迭代器模式的经典应用场景之一,即搜索算法。算法可遍历集合中的对象,并寻找满足特定条件的对象。

interface Iterator<T> {
    boolean hasNext();
    T next();
}

class ArrayListIterator<T> implements Iterator<T> {

    private ArrayList<T> list;
    private int index;

    public ArrayListIterator(ArrayList<T> list) {
        this.list = list;
        this.index = 0;
    }

    @Override
    public boolean hasNext() {
        return index < list.size();
    }

    @Override
    public T next() {
        return list.get(index++);
    }
}

class ArrayList<T> {

    private List<T> elements;

    public ArrayList() {
        elements = new ArrayList<>();
    }

    public void add(T element) {
        elements.add(element);
    }

    public Iterator<T> iterator() {
        return new ArrayListIterator<>(this);
    }
}

命令模式:电影中的导演

命令模式犹如电影中的导演,将任务分解为一系列步骤,并将这些步骤委派给不同的对象执行。此模式提供一种统一的方法来发出命令,使客户端程序能够以一致的方式执行不同的任务。

命令模式的主要优点:

  • 封装: 命令模式将任务封装成独立的对象,使任务更容易管理和重用。
  • 灵活性: 命令模式提供灵活的任务执行机制,客户端程序可以根据需要选择不同的命令来执行。
  • 解耦合: 命令模式将命令与客户端程序解耦合,使两**者可以独立变更,降低变更带来的影响。

命令模式的经典应用场景之一,即撤销/重做机制。系统可将每次执