java23种设计模式-行为型模式-观察者模式

一、定义

观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

二、优点及缺点

优点:

1、观察者和被观察者之间是抽象耦合,容易扩展观察者。

2、可以建立一套触发机制。

缺点:

1、观察者较多时,容易造成阻塞,因此可以采用异步的方式通知。

三、代码实现:

 抽象观察者:

package com.example.demo.sjms.guanchazhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:15
 *  @Description: 抽象观察者
 */
public interface Watcher {
    public void update();
}

具体观察者:

package com.example.demo.sjms.guanchazhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:58
 *  @Description: 具体观察者
 */
public class Student implements Watcher{
    @Override
    public void update() {
        System.out.println("老师,下课啦,放学回家!!!");
    }
}
package com.example.demo.sjms.guanchazhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:06
 *  @Description: 具体观察者
 */
public class Teacher implements Watcher{
    @Override
    public void update() {
        System.out.println("同学们,下课啦,放学回家吧!!!");
    }
}

抽象被观察者:

package com.example.demo.sjms.guanchazhemoshi;

import java.util.List;

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:03
 *  @Description: 抽象被观察者
 */
public interface Watched {
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:44
     *  @Description: 添加观察者
     */
    public void addWatcher(Watcher watcher);
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:20
     *  @Description: 删除观察者
     */
    public void removeWatcher(Watcher watcher);
    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:29
     *  @Description: 通知观察者
     */
    public void updateWatcher();
}

具体被观察者:

package com.example.demo.sjms.guanchazhemoshi;

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

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:26
 *  @Description: 课程
 */
public class Class implements Watched{
    private List<Watcher> watcherList;
    public Class(){
        watcherList = new ArrayList<Watcher>();
    }

    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:44
     *  @Description: 添加观察者
     */
    @Override
    public void addWatcher(Watcher watcher) {
        watcherList.add(watcher);
    }

    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:20
     *  @Description: 删除观察者
     */
    @Override
    public void removeWatcher(Watcher watcher) {
        watcherList.add(watcher);
    }

    /**
     *  @Author: caesar
     *  @Date:2020年11月24日 08:11:29
     *  @Description: 通知观察者
     */
    @Override
    public void updateWatcher() {
        watcherList.forEach(x -> {
            x.update();
        });
    }
}

测试类:

package com.example.demo.sjms.guanchazhemoshi;

/**
 *  @Author: caesar
 *  @Date:2020年11月24日 08:11:20
 *  @Description: 测试类
 */
public class Test {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Student student = new Student();
        Class clazz = new Class();
        clazz.addWatcher(teacher);
        clazz.addWatcher(student);
        // 开始通知
        clazz.updateWatcher();
    }
}

四、源码级别

五、总结

使用场景:对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。

原文地址:https://www.cnblogs.com/mcjhcnblogs/p/14028492.html