首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 設計模式深度解析:觀察者模式完整實戰

     編輯:Java 相關知識

模式定義

觀察者模式定義 一對多 依賴:主體對象狀態變更時,自動通知所有註冊的觀察者對象進行更新。

核心介面設計

// 主體介面
public interface ISubject {
    void registerObserver(IObserver observer);
    void removeObserver(IObserver observer);
    void notifyObserver();
}

// 觀察者介面
public interface IObserver {
    void remind(ITask taskSubject); // 更新方法
}

// 業務主體介面
public interface ITask {
    void setStatus(String status); String getStatus();
    void setProcess(String process); String getProcess();
    void setCheckList(String checkList); String getCheckList();
}

具體主體實現

public class TaskSubject implements ISubject, ITask {
    private static List<IObserver> _observers = new ArrayList<>();
    private String _status, _process, _checkList;

    public void registerObserver(IObserver o) {
        if (_observers.contains(o)) System.out.println(o + " already registered");
        else { _observers.add(o); System.out.println(o + " registered"); }
    }
    public void removeObserver(IObserver o) {
        if (!_observers.contains(o)) System.out.println(o + " never registered");
        else { _observers.remove(o); System.out.println(o + " removed"); }
    }
    public void notifyObserver() {
        for (IObserver o : _observers) o.remind(this);
    }
    // ITask getter/setter 略...
}

觀察者抽象基類

public abstract class TaskObserver implements IObserver {
    protected String _status, _process, _checkList;
    public void remind(ITask task) {
        this._status = task.getStatus();
        this._process = task.getProcess();
        this._checkList = task.getCheckList();
        sendEmail(); // 模擬通知發送
    }
    public abstract void sendEmail();
    protected void print(String msg) { System.out.println(msg); }
}

具體觀察者

public class Assignee extends TaskObserver {
    public void sendEmail() {
        print("[Assignee] Status: " + _status);
        print("[Assignee] Process: " + _process);
        print("[Assignee] CheckList: " + _checkList);
    }
    public String toString() { return "Assignee"; }
}
// Reviewer、Reporter 結構同理

客戶端演示

public class TaskManager {
    public static void main(String[] args) {
        TaskSubject subject = new TaskSubject();
        IObserver assignee = new Assignee();
        IObserver reviewer = new Reviewer();
        IObserver reporter = new Reporter();

        subject.registerObserver(assignee);
        subject.registerObserver(reviewer);
        subject.registerObserver(reporter);

        subject.setStatus("Assigned");
        subject.setProcess("No Process");
        subject.setCheckList("CheckList v1.0");
        subject.notifyObserver();

        subject.setStatus("In Progress");
        subject.setProcess("Process Attached");
        subject.setCheckList("Final Version");
        subject.removeObserver(reporter);
        subject.notifyObserver();
    }
}

輸出結果節錄

< Assignee > is registered successfully!
< Reviewer > is registered successfully!
< Reporter > is registered successfully!

[Assignee] The current status is : <Assigned>.
[Reviewer] The current status is : <Assigned>.
[Reporter] The current status is : <Assigned>.

< Reporter > is removed successfully!

[Assignee] The current status is : <In Progress>.
[Reviewer] The current status is : <In Progress>.

設計亮點

  1. 介面分離:ISubject、IObserver、ITask 職責單一。
  2. 抽象基類復用通知邏輯,具體觀察者僅實現差異化通知方式。
  3. 靜態觀察者列表確保單一來源,配合泛型避免類型轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved