Fundamentals 9 min read

Mastering the Observer Pattern: From Theory to Android Implementation

This article explains the Observer pattern’s one‑to‑many dependency concept, outlines its key components, provides a step‑by‑step Java implementation—including a custom news provider and user observer—demonstrates usage with JDK’s built‑in classes, and connects the pattern to Android callbacks.

ITFLY8 Architecture Home
ITFLY8 Architecture Home
ITFLY8 Architecture Home
Mastering the Observer Pattern: From Theory to Android Implementation

Observer Pattern Definition

The observer pattern defines a one‑to‑many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Key Terms

Observable (also called Subject) is the object being observed. It typically provides methods to register observers, remove them, and notify them.

Observer is the entity that receives updates from the observable. It registers to receive updates and can unregister when no longer needed.

Examples and Applications

A real‑world example is a newspaper subscription: users (observers) subscribe to a newspaper (observable); the newspaper sends new issues to all subscribers, and users can unsubscribe.

In Android, libraries such as EventBus and RxJava implement the observer pattern, as do callback mechanisms like button click listeners.

Implementing the Observer Pattern in Code

Below is a custom Java implementation that mimics the newspaper subscription example.

public interface MyObserverable {
    void register(MyObserver myObserver);
    void remove(MyObserver myObserver);
    void send(NewsModel model);
}

public interface MyObserver {
    void receive(NewsModel model);
}

public class NewsProvider implements MyObserverable {
    private static final long DELAY = 2 * 1000;
    private List<MyObserver> mObservers = new ArrayList<>();

    public NewsProvider() {
        generateNews();
    }

    private void generateNews() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            int titleCount = 1;
            int contentCount = 1;
            @Override
            public void run() {
                send(new NewsModel("title:" + titleCount++, "content:" + contentCount++));
            }
        }, DELAY, 1000);
    }

    @Override
    public void register(MyObserver myObserver) {
        if (myObserver == null) return;
        synchronized (this) {
            if (!mObservers.contains(myObserver)) {
                mObservers.add(myObserver);
            }
        }
    }

    @Override
    public synchronized void remove(MyObserver myObserver) {
        mObservers.remove(myObserver);
    }

    @Override
    public void send(NewsModel model) {
        for (MyObserver observer : mObservers) {
            observer.receive(model);
        }
    }
}

public class User implements MyObserver {
    private String mName;
    public User(String name) { mName = name; }
    @Override
    public void receive(NewsModel model) {
        System.out.println(mName + " receive news:" + model.getTitle() + " " + model.getContent());
    }
}

public class Test {
    public static void main(String[] args) {
        NewsProvider provider = new NewsProvider();
        for (int i = 0; i < 10; i++) {
            User user = new User("user:" + i);
            provider.register(user);
        }
    }
}

The program outputs each user receiving news updates every two seconds, demonstrating a simple observer pattern.

Using JDK’s Built‑in Observable

Java’s java.util.Observable and java.util.Observer provide a ready‑made implementation. By extending Observable and implementing Observer, you can achieve the same behavior with less code. The JDK version also includes a boolean changed flag to control notifications.

public class NewsProvider extends Observable {
    private static final long DELAY = 2 * 1000;
    public NewsProvider() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            int titleCount = 1;
            int contentCount = 1;
            @Override
            public void run() {
                setChanged();
                notifyObservers(new NewsModel("title:" + titleCount++, "content:" + contentCount++));
            }
        }, DELAY, 1000);
    }
}

public class User implements Observer {
    private String mName;
    public User(String name) { mName = name; }
    @Override
    public void update(Observable o, Object arg) {
        NewsModel model = (NewsModel) arg;
        System.out.println(mName + " receive news:" + model.getTitle() + " " + model.getContent());
    }
}

Callback Functions and the Observer Pattern

A callback can be viewed as a special case of the observer pattern. In Android, view click listeners are callbacks registered via setOnClickListener. The view acts as the observable, the listener as the observer, and the click event triggers the notification.

xxxView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // do something
    }
});

The Android framework defines the OnClickListener interface and the setOnClickListener method registers the callback. When the view is clicked, performClick() invokes the listener’s onClick method.

Observer pattern diagram
Observer pattern diagram
Program output
Program output
Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

AndroidObserver Patterncallback
ITFLY8 Architecture Home
Written by

ITFLY8 Architecture Home

ITFLY8 Architecture Home - focused on architecture knowledge sharing and exchange, covering project management and product design. Includes large-scale distributed website architecture (high performance, high availability, caching, message queues...), design patterns, architecture patterns, big data, project management (SCRUM, PMP, Prince2), product design, and more.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.