0Pricing
Clean Architecture & Design Patterns in Practice · 课时

观察者与策略模式

实现观察者模式管理依赖关系,并使用策略模式实现可互换的算法。

观察者与策略模式 是 CoddyKit 上的免费 Clean Architecture & Design Patterns in Practice 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Clean Architecture & Design Patterns in Practice 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Clean Architecture & Design Patterns in Practice 课程共包含 4 节课。

本课时的部分内容尚未翻译,以英文显示。

Behavioral Patterns: Actions & Interactions

Welcome to the world of Behavioral Design Patterns! These patterns focus on how objects interact and communicate, helping distribute responsibilities effectively.

They describe common communication patterns between objects, making your system more flexible and manageable.

Observer Pattern: Notifying Changes

First up is the Observer Pattern. Imagine you subscribe to a newsletter – when a new edition is out, you get notified! This pattern works similarly.

  • It defines a one-to-many dependency between objects.
  • When one object (the Subject) changes state, all its dependents (Observers) are notified and updated automatically.

It's great for event handling and distributed systems.

Observer Components: The Subject

The Subject (also known as Observable) is the object being watched. It has two main jobs:

  • Maintain a list of its observers.
  • Provide methods to attach (add) or detach (remove) observers.
  • Notify all attached observers when its state changes.

Think of it as the news publisher.

Observer Components: The Observer

The Observer is any object that wants to be notified of changes in the Subject. It defines an update() method.

  • When the Subject notifies, it calls each Observer's update() method.
  • This method allows the Observer to react to the change, perhaps by fetching new data or updating its display.

These are your newsletter subscribers!

Observer Pattern: Publisher & Subscribers

Let's see the Observer pattern in action with a simple news publisher and readers. The NewsPublisher is our Subject, and NewsReaders are our Observers.

Try running the code to see how readers get updates!

import java.util.ArrayList;
import java.util.List;

// Observer Interface
interface Subscriber {
    void update(String news);
}

// Subject Class
class NewsPublisher {
    private List<Subscriber> subscribers = new ArrayList<>();
    private String latestNews;

    public void addSubscriber(Subscriber s) {
        subscribers.add(s);
    }

    public void removeSubscriber(Subscriber s) {
        subscribers.remove(s);
    }

    public void publishNews(String news) {
        this.latestNews = news;
        notifySubscribers();
    }

    private void notifySubscribers() {
        for (Subscriber s : subscribers) {
            s.update(latestNews);
        }
    }
}

// Concrete Observer
class NewsReader implements Subscriber {
    private String name;

    public NewsReader(String name) {
        this.name = name;
    }

    @Override
    public void update(String news) {
        System.out.println(name + " received: " + news);
    }
}

public class Main {
    public static void main(String[] args) {
        NewsPublisher publisher = new NewsPublisher();

        NewsReader reader1 = new NewsReader("Alice");
        NewsReader reader2 = new NewsReader("Bob");

        publisher.addSubscriber(reader1);
        publisher.addSubscriber(reader2);

        publisher.publishNews("Breaking: New programming course released!");

        System.out.println("\nAlice unsubscribes...");
        publisher.removeSubscriber(reader1);
        publisher.publishNews("Update: Course enrollment extended!");
    }
}

Strategy Pattern: Choosing Algorithms

Next, we have the Strategy Pattern. This pattern allows you to define a family of algorithms, encapsulate each one, and make them interchangeable.

It lets the algorithm vary independently from clients that use it. Think of choosing different payment methods (credit card, PayPal, bank transfer) at checkout.

Strategy Components: The Strategy

The Strategy is an interface or abstract class that declares a common operation for all supported algorithms.

  • Each specific algorithm (e.g., CreditCardPayment, PayPalPayment) implements this interface.
  • This ensures they all have the same method signature, making them interchangeable.

Strategy Components: The Context

The Context is the class that holds a reference to a Strategy object. It defines an interface for clients to interact with.

  • The Context does not know which concrete strategy it is using.
  • It delegates the execution of the algorithm to its current Strategy object.

This keeps the Context simple and flexible, as it doesn't need to change when new strategies are added.

Strategy Pattern: Payment Methods

Here's a practical example of the Strategy pattern. We have different payment strategies (Credit Card, PayPal) and a ShoppingCart as our Context.

Notice how the ShoppingCart can easily switch between payment methods without changing its own core logic.

interface PaymentStrategy {
    void pay(int amount);
}

class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;
    public CreditCardPayment(String card) { this.cardNumber = card; }
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card " + cardNumber);
    }
}

class PayPalPayment implements PaymentStrategy {
    private String email;
    public PayPalPayment(String email) { this.email = email; }
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using PayPal account: " + email);
    }
}

class ShoppingCart {
    private PaymentStrategy strategy;
    public void setPaymentStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }
    public void checkout(int amount) {
        if (strategy == null) {
            System.out.println("Please set a payment strategy first.");
            return;
        }
        strategy.pay(amount);
    }
}

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // Pay with Credit Card
        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456"));
        cart.checkout(100);

        // Pay with PayPal
        cart.setPaymentStrategy(new PayPalPayment("user@example.com"));
        cart.checkout(50);
    }
}

Quick Check: Observer or Strategy?

Consider a stock trading application. It needs to calculate trading fees using different methods (e.g., a flat fee, a percentage of trade value, or a tiered system) based on the user's account type. The application should be able to easily switch between these methods.

Recap: Notifying & Swapping

Great job! You've explored two powerful behavioral design patterns:

  • Observer Pattern: Manages one-to-many dependencies, where a Subject notifies multiple Observers of state changes. It promotes loose coupling between components.
  • Strategy Pattern: Allows you to define a family of algorithms, encapsulate each one, and make them interchangeable. It helps in swapping algorithms at runtime, promoting flexibility and clean code.

These patterns help make your code more modular, flexible, and easier to maintain!

常见问题解答

「观察者与策略模式」课时是免费的吗?

是的 — 「观察者与策略模式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Clean Architecture & Design Patterns in Practice 课程的其余内容,请升级到 CoddyKit PRO。 Clean Architecture & Design Patterns in Practice 课程共包含 4 节课。

「观察者与策略模式」这节课中我会学到什么?

实现观察者模式管理依赖关系,并使用策略模式实现可互换的算法。 你通过在浏览器中直接运行的动手代码来练习 Clean Architecture & Design Patterns in Practice,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Clean Architecture & Design Patterns in Practice 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Clean Architecture & Design Patterns in Practice 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「观察者与策略模式」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Clean Architecture & Design Patterns in Practice 课中编写并运行代码吗?

能。每节 Clean Architecture & Design Patterns in Practice 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 观察者与策略模式
  2. 命令与迭代器模式
  3. 模板方法与状态模式
  4. 中介者模式与责任链模式
← 返回 Clean Architecture & Design Patterns in Practice