简述观察者模式

355 阅读2分钟
设计模式学一学,各种知识百度有

首先来百度一下什么是观察者模式:

  • 观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。
  • 在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。 由此可见,观察者模式其实就是维持了一对多的关系,将主题信息传递给对应的观察者的过程,那对应的关系为: 一个图片 首先创建主题类,包含添加观察者、删除观察者和告知观察者三个接口:
public interface Subject {
    /**
     * 注册观察者
     *
     * @param observer
     */
    void register(Observer observer);

    /**
     * 删除观察者
     *
     * @param observer
     */
    void delete(Observer observer);

    /**
     * 通知观察者
     */
    void notice(String notice);
}

然后实现主题类,实现添加、删除和通知观察者的具体功能:

public class SubjectImpl implements Subject {
    Set<Observer> set = new HashSet<>();
    
    @Override
    public void register(Observer observer) {
        set.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        set.remove(observer);
    }

    @Override
    public void notice(String notice) {
        set.forEach(observer -> {
            observer.putMessage(notice);
        });
    }
}

主题类有了,那要通知给哪些观察者呢?让我们创建几个吧!让所有的观察者都实现相同的接口,归为一类:

public interface Observer {
    /**
     * 发送消息
     * @param message
     */
    void putMessage(String message);
}

观察者1号:

public class Observer1 implements Observer {

    @Override
    public void putMessage(String message) {
        System.out.println(message + "observer1");
    }
}

观察者2号:

public class Observer2 implements Observer {

    @Override
    public void putMessage(String message) {
        System.out.println(message + "observer2");
    }
}

观察者模式的核心观察者和主题都创建好了,让我们触发一下吧!

public class Test {
    public static void main(String[] args) {
        Observer observer1 = new Observer1();
        Observer observer2 = new Observer2();
        SubjectImpl subject = new SubjectImpl();
        subject.register(observer1);
        subject.register(observer2);
        //通知所有注册的观察者
        subject.notice("我是测试");
        //删除观察者2号
        subject.delete(observer2);

        System.out.println("------------------- 分割线 -------------------");

        subject.notice("我是测试");
    }
}

查看代码的运行结果:

这就是观察者模式的简单实现,起到了一呼百应的作用,着实厉害!