几个同事上班期间看股市行情,让前台MM帮忙看着老板什么时候过来查岗,老板进门的时候MM就拨电话给其中一个同事,于是所有同事都知道了,再继续工作。。。
/**
* 前台秘书MM
* Created by callmeDevil on 2019/7/27.
*/
public class Secretary {
// 同事列表
private List<StockObserver> observers = new ArrayList<>();
private String action;
// 增加
public void attach(StockObserver observer){
// 有几个同事请前台帮忙,于是就给集合增加几个对象
observers.add(observer);
}
// 通知
public void call(){
// 待老板来了,就给所有登记的同事们发通知
for (StockObserver observer : observers) {
observer.update();
}
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
/**
* 看股票同事
* Created by callmeDevil on 2019/7/27.
*/
public class StockObserver {
private String name;
private Secretary sub;
public StockObserver(String name, Secretary sub){
this.name = name;
this.sub = sub;
}
public void update(){
System.out.println(String.format("%s %s 关闭股票行情,继续工作!", sub.getAction(), name));
}
}
public class Test {
public static void main(String[] args) {
// 前台妹子
Secretary mm = new Secretary();
// 看股票的同事
StockObserver observer1 = new StockObserver("哪路托", mm);
StockObserver observer2 = new StockObserver("啥是gay", mm);
// 前台妹子记下两位同事
mm.attach(observer1);
mm.attach(observer2);
// 发现老板
mm.setAction("老板回来了!");
// 通知两个同事
mm.call();
}
}
老板回来了! 哪路托 关闭股票行情,继续工作!
老板回来了! 啥是gay 关闭股票行情,继续工作!
/**
* 抽象观察者
* Created by callmeDevil on 2019/7/27.
*/
public abstract class Observer {
protected String name;
protected Secretary sub;
public Observer(String name, Secretary sub) {
this.name = name;
this.sub = sub;
}
public abstract void update();
}
/**
* 前台秘书MM
* Created by callmeDevil on 2019/7/27.
*/
public class Secretary {
// 同事列表
private List<Observer> observers = new ArrayList<>();
private String action;
// 增加
public void attach(Observer observer) { //针对抽象编程,减少了与具体类的耦合
observers.add(observer);
}
// 减少
public void detach(Observer observer) { //针对抽象编程,减少了与具体类的耦合
observers.remove(observer);
}
// 通知
public void call() {
for (Observer observer : observers) {
observer.update();
}
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
/**
* 看股票的同事
* Created by callmeDevil on 2019/7/27.
*/
public class StockObserver extends Observer {
public StockObserver(String name, Secretary sub) {
super(name, sub);
}
@Override
public void update(){
System.out.println(String.format("%s %s 关闭股票行情,继续工作!", sub.getAction(), name));
}
}
/**
* 看 NBA 的同事
* Created by callmeDevil on 2019/7/27.
*/
public class NBAObserver extends Observer {
public NBAObserver(String name, Secretary sub) {
super(name, sub);
}
@Override
public void update() {
System.out.println(String.format("%s %s 关闭NBA 直播,继续工作!", sub.getAction(), name));
}
}
测试代码同上
其实“前台MM”也应该抽象出来,如果老板回来时,MM来不及电话了,于是通知大家的任务变成谁来做?是的,这时候是老板本人变成了通知者。
又叫做发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
/**
* 通知者接口
* Created by callmeDevil on 2019/7/27.
*/
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void call();
String getAction();
void setAction(String action);
}
/**
* 老板
* Created by callmeDevil on 2019/7/27.
*/
public class Boss implements Subject {
// 同事列表
private List<Observer> observers = new ArrayList<>();
private String action;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void call() {
for (Observer observer : observers) {
observer.update();
}
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
/**
* 抽象观察者
* Created by callmeDevil on 2019/7/27.
*/
public abstract class Observer {
protected String name;
protected Subject sub;
public Observer(String name, Subject sub) { // 原来是“前台MM”,现改成“抽象通知者”
this.name = name;
this.sub = sub;
}
public abstract void update();
}
/**
* 看股票的同事
* Created by callmeDevil on 2019/7/27.
*/
public class StockObserver extends Observer {
public StockObserver(String name, Subject sub) { // 原来是“前台MM”,现改成“抽象通知者”
super(name, sub);
}
@Override
public void update(){
System.out.println(String.format("%s %s 关闭股票行情,继续工作!", sub.getAction(), name));
}
}
public class Test {
public static void main(String[] args) {
// 老板
Boss boss = new Boss();
// 看股票的同事
StockObserver observer1 = new StockObserver("哪路托", boss);
// 看NBA的同事
NBAObserver observer2 = new NBAObserver("啥事gay", boss);
boss.attach(observer1);
boss.attach(observer2);
boss.detach(observer1); // 主角光环!斑怎么样都打不过哪路托!所以减去
// 斑复活了!
boss.setAction("我宇智波斑复活了!");
// 发出通知
boss.call();
}
}
我宇智波斑复活了! 啥事gay 关闭NBA 直播,继续工作!
原文:https://www.cnblogs.com/call-me-devil/p/11255562.html