观察者模式

定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

观察者模式结果图

subject:抽象主题,定义了具体添加、删除观察者接口、通知接口。

concreteSubject:具体主题,具体实现了所有接口,并将所有观察者存放在一个集合中,当主题变化时,通过notify接口通知所有观察者。

observer:观察者接口,定义了更新状态接口

concreteObserver:具体观察者,实现了当主题变化后,具体的操作内容。

优缺点

优点:解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。

缺点:如果一个观察者执行逻辑复杂,则会导致整体比较慢

简单demo

背景

背景为当老板来开会了,员工需要认真记录会议内容,以供自己学习。

解析

老板是实际的主题,会影响员工状态

员工是观察者,当感知到老板来了以后,需要认真记录会议内容

代码实现

主题接口:

public interface Subject
{
    public void addObserver(Observer obj);
    public void deleteObserver(Observer obj);
    public void notifyObserver();
}

观察者接口:

public interface Observer
{
    public void update(String info);
}

boss具体实现主题:

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

public class Boss implements Subject
{
    private List<Observer> objList = new ArrayList<Observer>();
    @Override
    public void addObserver(Observer obj)
    {
        objList.add(obj);
    }
    
    @Override
    public void deleteObserver(Observer obj)
    {
        objList.remove(obj);
    }
    
    @Override
    public void notifyObserver()
    {
        for(Observer obj : objList)
        {
            obj.update("老板来开会");
        }
    }
    
}

员工具体实现观察者:

public class Employee implements Observer
{
    private String name;
    
    public Employee(String name)
    {
        this.name = name;
    }

    @Override
    public void update(String info)
    {
        System.out.println(info + " " + name + "认真记录会议内容。");
    }
}

客户端验证:

public class TestClient
{
    public static void main(String[] args)
    {
        Employee e1 = new Employee("蜗牛");
        Employee e2 = new Employee("贝壳");
        
        Subject boss = new Boss();
        boss.addObserver(e1);
        boss.addObserver(e2);
        
        boss.notifyObserver();
    }
}

内容如下:

老板来开会 蜗牛认真记录会议内容。
老板来开会 贝壳认真记录会议内容。

 

posted @ 2018-01-31 16:45  woniu4  阅读(151)  评论(0编辑  收藏  举报