JAVA设计模式——观察者模式
前言:
观察者模式,又可以称之为发布-订阅模式,顾名思义,简而言之我们可以理解成,7点半播放天气预报,电视里那个主持人就是发布者,也就是所谓的被观察者,我们这些听天气预报的人也就是所谓的观察者。也就是说他一个人(被观察者)发布一条消息,我们这些听天气预报的人(观察者)都知道了这个消息。
1,被观察者接口(也就是天气预报主持人的接口,每天可以换主持人播报):
package com.itpengwei.design;
/**
* @author 彭伟
* @Date 2019/1/4 20:30
* 被观察者接口
* 声明了添加,删除,通知观察者方法
*/
public interface Observerable {
/**
* @param observer 抽象观察者
* 添加观察者
*/
void registerObserver(Observer observer);
/**
* @param observer 抽象观察者
* 删除观察者
*/
void removeObserver(Observer observer);
/**
* 通知观察者
*/
void notifyObserver();
}
2,消费者的接口(也就是所谓的收听天气预报的所有人统称为收听者)
package com.itpengwei.design;
/**
* @author 彭伟
* @Date 2019/1/4 20:32
* 观察者接口,收听天气预报的人的统称
*/
public interface Observer {
/**
* @param msg 消息
* 生产者发布通知,接口进行回调
*/
void update(String msg);
}
3,被观察者实现(天气预报主持人)
package com.itpengwei.design;
import java.util.ArrayList;
import java.util.List;
/**
* @author 彭伟
* @Date 2019/1/4 20:54
* 被观察者,也就是天气预报总站
* 实现了Oberverable接口,对它进行了一个实现
*/
public class WeacherServer implements Observerable {
/**
* 装所有消费者
*/
private List<Observer> list;
private String msg;
public WeacherServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if (!list.isEmpty()) {
list.remove(observer);
}
}
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.update(msg);
}
}
/**
* @param s 发送消息内容
* 发送消息方法
*/
public void sendmsg(String s) {
this.msg = s;
System.out.println("----生产者生产的新消息-------");
//消息更新,通知所有观察者
notifyObserver();
}
}
4,消费者具体实现
package com.itpengwei.design;
/**
* @author 彭伟
* @Date 2019/1/4 21:02
* 消费者,也就是听天气预报的人
*/
public class Consumer implements Observer {
private String username;
public Consumer(String username) {
this.username = username;
}
@Override
public void update(String msg) {
System.out.println("----"+this.username+"----" + msg);
}
}
5,测试类
import com.itpengwei.design.Consumer;
import com.itpengwei.design.Observer;
import com.itpengwei.design.WeacherServer;
public class Main {
public static void main(String[] args) {
WeacherServer server = new WeacherServer();
Observer userzhang = new Consumer("张三");
Observer userlisi = new Consumer("李四");
Observer userwangwu = new Consumer("王五");
server.registerObserver(userzhang);
server.registerObserver(userlisi);
server.registerObserver(userwangwu);
//第一次发消息,消费者为3个人
server.sendmsg("今天晴,气温27℃");
//第二次推送消息,消费者为4个人,加了个赵六
System.out.println("----添加了赵六后总共有4个消费者了--------");
Observer userzhaoliu = new Consumer("赵六");
server.registerObserver(userzhaoliu);
server.sendmsg("今天下雨,气温23℃");
}
}
6,测试结果
7,总结" class="reference-link">
7,总结
通过上面的实例可以很明显的看出,观察者模式的大概模型,关键是什么呢?
1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。
2、重点就在被观察者的实现中:
(1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)
(2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)
3、观察者中需要有个接收被观察者通知的方法。
观察者模式定义的是一对多的依赖关系,一个被观察者可以拥有多个观察者,并且通过接口对观察者与被观察者进行逻辑解耦,降低二者的直接耦合。
还没有评论,来说两句吧...