java设计模式--观察者模式

  观察者模式:又称发布-订阅(Publish/Subscribe)模式。咱们先看一个例子,如今直播行业越作越大,许多人都有关注本身喜欢的主播,人们订阅某一个主播,当该主播开播时,给订阅他的人发布提示说他开始直播了,这就是一个观察者模式的实例。网络

  通知者类,提供了增长和删除,以及通知观察者对象的方法。ide

//网络主播类
public class NetworkAnchor {
    //定义一个观察者的集合
    List<People> observers = new ArrayList<>();

    //当有人订阅了该主播,便把这个对象加入集合
    public void subscribe(People people){
        if(people!=null && !observers.contains(people)){
            observers.add(people);
        }
    }
    //取消订阅
    public void cancel(People people){
        observers.remove(people);
    }
    //主播开播时通知观察者
    public void notifyPeople(){
        for (People people: observers) {
            people.update(this);
        }
    }
}

  

  观察者接口,在获得通知者的通知时更新本身。测试

//网民类
public interface People {
    //定义一个更新方法,用于更新状态
    void update(NetworkAnchor networkAnchor);
}

  

  具体的观察者对象。this

//具体网民类A
public class PeopleA implements People {

    @Override
    public void update(NetworkAnchor networkAnchor) {
        System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }
//具体网民类B
public class PeopleB implements People {

    @Override
    public void update(NetworkAnchor networkAnchor) {
        System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }

  

  测试方法,首先建立一个主播类实例,将观察者A,B添加进去,而后发布通知。spa

//测试类
public class Test {
    public static void main(String[] args) {
        NetworkAnchor networkAnchor = new NetworkAnchor();
        networkAnchor.subscribe(new PeopleA());
        networkAnchor.subscribe(new PeopleB());
        networkAnchor.notifyPeople();
    }
}

测试结果:code

PeopleA收到NetworkAnchor的消息
PeopleB收到NetworkAnchor的消息server

 

  总结:当一个对象的改变须要改变其余对象,而且被改变对象不知道其余被改变对象时,咱们可使用观察者模式。而且使用观察者模式分离了观察者与被观察者,下降耦合程度,除此以外,当有其余的网络主播时,咱们能够定义一个通知者的接口(这里再也不实现),使全部通知者实现这个接口便可。让耦合的双方依赖抽象,符合依赖倒转原则。对象

相关文章
相关标签/搜索