观察者模式,(又称为发布-订阅模式),我来说一下我对观察者模式的理解.
设计模式的设计思路也是来自于生活的,观察者模式在生活中也有体现.
比如:
校长发布广播,全体学生来操场开会;
广播室具有发布广播的功能,
校长实现了广播的功能,是一个具体的发布者;
各个教室的喇叭具有接受广播的功能,
学生实现了接收广播的功能,是一个具体的订阅者.
再比如:
Hr通过邮箱发布通知,所以面试人员明天下午来公司面试;
Hr的邮箱具有面试通知功能,
Hr实现了面试通知的功能,是一个具体的发布者;
面试人员的邮箱具有接收面试通知的功能,
校招人员实现了接收面试通知的功能.
在下面的程序里我已面试通知为例,写了一个Demo
package com.lizhenbo.observerdemo;
/**
* 通知者的接口,所有具体的通知者,必须实现该接口
* 暂且可以比作,面试通知的功能(HR,项目经理,老板...谁需要这个功能谁就实现这个接口)
* @author LIZHENBO
*/
public interface Subject {
//添加订阅者
void Attach(Observer observer);
//移除订阅者
void Detach(Observer observer);
//通知订阅者
void NotifyObserver();
}
package com.lizhenbo.observerdemo;
/**
* 观察者的接口,所有具体的观察者都必须实现该接口
* 暂且可以比作,观察者(所有具体的观察者(社招人员,校招人员...)接受到通知后要更新状态都必须实现该接口)
* @author LIZHENBO
*
*/
public interface Observer {
//订阅者收到通知后更新状态
void Update();
}
package com.lizhenbo.observerdemo;
import java.util.ArrayList;
/**
* 具体的通知类Hr(Boss,项目经理的具体类不在赘述)
* @author LIZHENBO
*/
public class HrSubject implements Subject{
private String name;//名字非必要,为了方便理解加上的
private ArrayList<Observer> observers=new ArrayList<Observer>();
public HrSubject(String name) {
super();
this.name = name;
}
@Override
public void Attach(Observer observer) {
observers.add(observer);
}
@Override
public void Detach(Observer observer) {
observers.remove(observer);
}
@Override
public void NotifyObserver() {
for (Observer observer : observers) {
System.out.println("我是Hr:"+name+",通知您来面试!!");
observer.Update();
}
}
}
package com.lizhenbo.observerdemo;
/**
* 具体的观察者Student(订阅者),社招人员的具体类不在赘述
* @author LIZHENBO
*/
public class StudentObserver implements Observer{
private String name;//名字非必要,为了方便理解加上的
public StudentObserver(String name) {
super();
this.name = name;
}
@Override
public void Update() {
System.out.println("我是"+name+"已接收到面试通知,一定准时到达!!");
}
}
package com.lizhenbo.observerdemo;
public class ObserverTest {
public static void main(String[] args) {
//创建一个名字为马云的Hr的通知者
HrSubject hr=new HrSubject("马云");
//创建了三个校招人员的订阅者
StudentObserver student01=new StudentObserver("李振博");
StudentObserver student02=new StudentObserver("李明夏");
StudentObserver student03=new StudentObserver("李明月");
//添加和移除订阅者
hr.Attach(student01);
hr.Attach(student02);
hr.Attach(student03);
hr.Detach(student03);
//通知已经添加的所有订阅者
hr.NotifyObserver();
}
}
运行结果:
最后奉献上GitHub地址:https://github.com/zhenbo929/ObserverDemo