观察者模式(Observer):观察者模式又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
package observer;
/**
* 观察者模式(Observer)
* 通知者接口
*/
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notice();
String getAction();
void setAction(String action);
}
package observer;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式(Observer)
* 老板类
*/
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 notice() {
for (Observer o : observers) {
o.update();
}
}
@Override
public String getAction() {
return action;
}
@Override
public void setAction(String action) {
this.action = action;
}
}
package observer;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式(Observer)
* 秘书类
*/
public class Secretary 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 notice() {
for (Observer o : observers) {
o.update();
}
}
@Override
public String getAction() {
return action;
}
@Override
public void setAction(String action) {
this.action = action;
}
}
package observer;
/**
* 观察者模式(Observer)
* 抽象观察者
*/
public abstract class Observer {
protected String name;
protected Subject subject;
public Observer(String name, Subject subject) {
this.name = name;
this.subject = subject;
}
public abstract void update();
}
package observer;
/**
* 观察者模式(Observer)
* 看股票的同事
*/
public class StockObserver extends Observer {
public StockObserver(String name, Subject subject) {
super(name, subject);
}
@Override
public void update() {
System.out.println(subject.getAction() + name + " 关闭股票行情,继续工作!");
}
}
package observer;
/**
* 观察者模式(Observer)
* 看NBA的同事
*/
public class NBAObserver extends Observer {
public NBAObserver(String name, Subject subject) {
super(name, subject);
}
@Override
public void update() {
System.out.println(subject.getAction() + name + " 关闭NBA直播,继续工作!");
}
}
package observer;
/**
* 观察者模式(Observer)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
// 老板
Boss boss = new Boss();
// 看股票的同事
StockObserver worker1 = new StockObserver("舒克", boss);
// 看NBA的同事
NBAObserver worker2 = new NBAObserver("贝塔", boss);
boss.attach(worker1);
boss.attach(worker2);
boss.detach(worker1);
// 老板回来
boss.setAction("我胡汉三回来啦!");
// 发出通知
boss.notice();
}
}