设计模式(java)

观察者模式

2019-06-19  本文已影响0人  降龙_伏虎

1.定义

观察者模式(Observer Pattern) 定义了对象之间一对多依赖
让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(监听者)都会收到通知并更新
属于行为型模式
也叫作发布订阅模式

2.JDK实现

/**
 * Description:论坛(被观察者)
 *
 * @date 2019-05-28 20:25
 */

public class Forum extends Observable {

    private String name = "XX论坛";
    private static Forum instance;

    private Forum() {
    }

    public static Forum getInstance() {
        if (instance == null) {
            instance = new Forum();
        }
        return instance;
    }

    public String getName() {
        return name;
    }


    public void publish(Question question) {
        System.out.println(question.getUserName() + "发布一个问题,具体内容为:" + question.getContent());
        setChanged();
        notifyObservers(question);
    }
}

/**
 * Description:问题
 *
 * @date 2019-05-28 20:36
 */

public class Question {

    private String userName;
    private String content;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

/**
 * Description:版主(观察者)
 *
 * @date 2019-05-28 20:38
 */

public class Moderator  implements Observer {

    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        Forum forum = (Forum)o;
        Question question = (Question)arg;
        System.out.println("======================================");
        System.out.println(name+"版主,你好"+"\n"
        +question.getUserName()+"在 <"+forum.getName()+"> 发布了一个问题,\n"
        +"内容:"+question.getContent());
    }
}

/**
 * Description:测试类
 *
 * @date 2019-05-28 20:44
 */

public class Test {

    public static void main(String[] args) {

        Forum forum = Forum.getInstance();
        Moderator a = new  Moderator("A版主");
        Moderator b = new  Moderator("B版主");

        Question question = new Question();
        question.setUserName("小白");
        question.setContent("花儿为什么这样红?");

        forum.addObserver(a);
        forum.addObserver(b);

        forum.publish(question);
    }
}

3.guava实现

public class GuavaEvent {

    @Subscribe
    public void  subscribe(String src){
        System.out.println("执行GuavaEvent 类的subscribe("+src+")方法");
    }
}

public class Test {

    public static void main(String[] args) {
        //消息总线
        EventBus eventBus = new EventBus();
        
        GuavaEvent guavaEvent = new GuavaEvent();

        eventBus.register(guavaEvent);
        eventBus.post("sKy");
    }

}
上一篇 下一篇

猜你喜欢

热点阅读