参考链接: 观察者模式
前言
常用的设计模式
一、观察者模式
Observer接口代码如下:
public interface Observer {
/*
* 观察者获得消息
* @param msg
* */
public void update(String msg);
}
Subject接口代码如下:
public interface Subject {
/*
*注册观察者
* @param ob
* */
public void registerObserver(Observer ob);
/*
*取消观察者
* @param ob
* */
public void removerObserver(Observer ob);
/*
*通知观察者
* */
public void notifyObserver();
}
Subject3DSubject代码如下:
public class Sport3DSubject implements Subject{
private String msg;
/*
* 定义一个集合存储观察者对象
* */
private List<Observer> observers = new ArrayList<>();
/*
* 注册观察者,一定有地方存储观察者对象
* */
@Override
public void registerObserver(Observer ob) {
//添加观察者
observers.add(ob);
}
@Override
public void removerObserver(Observer ob) {
//检验这个观察者是否在集合中
int index = observers.indexOf(ob);
if (index>=0){
observers.remove(index);
}
}
/*
* 通知观察者
* */
@Override
public void notifyObserver() {
//遍历观察者
for (Observer observer : observers) {
//发送消息
observer.update(msg);
}
}
/*给福彩主题对象设置要发送的消息
* @param msg
* */
public void setMsg(String msg) {
this.msg = msg;
//通知观察者
notifyObserver();
}
}
ObserverPerson代码如下:
public class ObserverPerson implements Observer{
/*
* 定义这个观察者的名字属性
* */
private String name;
/*
* 这个具体的观察者订阅的主题
* */
private Subject subject;
/*
* 这是一个构造器
* @param name
* @param subject
* */
public ObserverPerson(String name, Subject subject) {
this.name = name;
this.subject = subject;
//我要注册我自己到一个指定的主题上
subject.registerObserver(this);
}
@Override
public void update(String msg) {
System.out.println(name + msg);
}
}
测试类Test代码如下 :
public class Test {
public static void main(String[] args) {
//创建一个主题
Sport3DSubject subject = new Sport3DSubject();
//创建两个观察者
ObserverPerson p1 = new ObserverPerson("五阶",subject);
ObserverPerson p2 = new ObserverPerson("Key Ma",subject);
ObserverPerson p3 = new ObserverPerson("空白格",subject);
subject.setMsg("您好,本期的开奖结果是 01 32 02 31 12 11");
}
}