观察者模式

观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。

观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

现在我们举一个类似的情况,并使用代码来实现,为大家提供一个比较明显的认识。

大家都用过交流平台工具,如微信、qq,那么肯定知道"特别关心"这个功能,当你将谁设置为特别关心的时候,那个人一但发表朋友圈,系统就会立刻通知你,你的特别关心好友发表了一遍文章。。。假设小新的爸爸妈妈将小新设为了特别关心,用观察者模式改如何实现呢?那么我们就来实现下吧。

1、//观察者

//观察者
public class PersonObserver implements Observer {

    private String name;

    public PersonObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        Circle circle = (Circle)o;
        Infomation args = (Infomation)arg;
        System.out.println(name+"接收到一个"+args.getName()+"发表的一个"+circle.getName()+"的朋友圈--"+args.getContext());
    }
}

2、被观察者信息

public class Infomation {

    private String name;

    private String context;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }
}

3、被观察者

public class Circle  extends Observable {

    private String name;

    public Circle(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    public void produceInfo(Circle circle,Infomation infomation){
        System.out.println(infomation.getName()+"发表了一个关于"+circle.getName()+"的朋友圈---"+infomation.getContext());
        setChanged();
        notifyObservers(infomation);
    }
}

4、测试代码

public class Test {

    public static void main(String[] args) {
        Circle circle = new Circle("新年");
        PersonObserver persion = new PersonObserver("小新爸爸");
        circle.addObserver(persion);
        PersonObserver persion2 = new PersonObserver("小新妈妈");
        circle.addObserver(persion2);

        Infomation infomation = new Infomation();
        infomation.setName("小新");
        infomation.setContext("今天是个好日子");
        circle.produceInfo(circle,infomation);
    }
}

运行结果为:

想要飞得更高,就该忘记地平线!
原文地址:https://www.cnblogs.com/shenwen/p/12686128.html