观察者模式

是什么观察者模式

观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。

什么时候可以使用观察者模式

当一个事件发生或者一个东西的状态发生了变化时,会有其他响应的事件被触发。例如,当一个用户在注册之后成为一个系统的用户时,系统可能会给他发邮件、发放一些优惠券并且同时去推荐用户一些内容。这个时候就可以使用观察者模式。
又或者一些用户订阅了一个公众号,每当公众号有内文章发布时,这个用户就会受到相应的通知。这也是使用了关观察者模式。

观察者模式代码演示

// 当用户在注册成功之后用户的相关信息
public class Message {
}

//用来保存观察者,并提供通知功能
public interface Subject {
    public void registerObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void notifyObservers(Message message);
}

//观察者
public interface Observer {
    public void update(Message message);
}

//Subject的具体实现
public class UserRegisterSubject implements Subject {
    private List<Observer> observers = new ArrayList<Observer>();

    @Override
    public void registerObserver(Observer observer) {
        if (observer != null) {
            observers.add(observer);
        }
    }

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

    @Override
    public void notifyObservers(Message message) {
        for (Observer o : observers) {
            o.update(message);
        }

    }
}

//当收到通知之后,给用户发邮件
public class EmailObserver implements Observer {
    @Override
    public void update(Message message) {
        System.out.println("Send email to user");
    }
}

//当收到通知之后,给用户推送内容
public class RecommdationObserver implements Observer{
    @Override
    public void update(Message message) {
        System.out.println("Recommend hot news to user...");
    }
}

public class Application {
    public static void main(String[] args) {
        Subject subject = new UserRegisterSubject();
        Observer emailObserver = new EmailObserver();
        Observer recommendationObserver = new RecommdationObserver();
        subject.registerObserver(emailObserver);
        subject.registerObserver(recommendationObserver);

        System.out.println("when a user registered");
        subject.notifyObservers(new Message());
    }
}

观察者模式的优缺点

优点

  • 开闭原则。 你无需修改发布者代码就能引入新的订阅者类 (如果是发布者接口则可轻松引入发布者类)。
  • 你可以在运行时建立对象之间的联系。

缺点

  • 订阅者的通知顺序是随机的。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容