场景:将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。而观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。
当一个对象的改变需要同时改变其他对象的时候。而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
1. 可以理解为发布-订阅模式
package com.hj.designPattern.behavior.observer.observerSimple;
public abstract class AbstracObserver {
public abstract void update();
}
package com.hj.designPattern.behavior.observer.observerSimple;
public class Observer1 extends AbstracObserver {
public Notifier getNotifier() {
return notifier;
}
public void setNotifier(Notifier notifier) {
this.notifier = notifier;
}
private Notifier notifier;
public Observer1 (Notifier notifier){
this.notifier = notifier;
}
@Override
public void update() {
System.out.println("具体观察者1被通知, 通知者状态为:" + notifier.getState());
}
}
package com.hj.designPattern.behavior.observer.observerSimple;
public class Observer2 extends AbstracObserver{
private Notifier notifier;
public Observer2(Notifier notifier){
this.notifier = notifier;
}
@Override
public void update() {
System.out.println("具体观察者2被通知, 通知者状态为:" + notifier.getState());
}
}
2. 发布者
package com.hj.designPattern.behavior.observer.observerSimple;
import java.util.ArrayList;
import java.util.List;
public class Notifier {
private List<AbstracObserver> list = new ArrayList<>();
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public void attach(AbstracObserver abstracObserver){
list.add(abstracObserver);
}
public void detatch(AbstracObserver abstracObserver){
list.remove(abstracObserver);
}
public void update(){
for(AbstracObserver observer:list){
observer.update();
}
}
}
3. 测试类
package com.hj.designPattern.behavior.observer.observerSimple;
public class ObserverSimpleTest {
public static void main(String[] args) {
Notifier notifier = new Notifier();
notifier.setState("状态为迷茫");
Observer1 observer1 = new Observer1(notifier);
Observer2 observer2 = new Observer2(notifier);
notifier.attach(observer1);
notifier.attach(observer2);
notifier.update();
notifier.setState("状态为无助");
notifier.update();
}
}
代码示例2
老板回来了,前台通知好友员工关闭娱乐相关活动
1. 职员父类、bossback接口
package com.hj.designPattern.behavior.observer;
public class ZhiyuanParent implements BossBack{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void bossBack() {
}
}
package com.hj.designPattern.behavior.observer;
public interface BossBack {
void bossBack();
}
2. 老板、前台、职员类
package com.hj.designPattern.behavior.observer;
public class Boss extends ZhiyuanParent implements BossBack{
private QianTai qianTai;
public QianTai getQianTai() {
return qianTai;
}
public void setQianTai(QianTai qianTai) {
this.qianTai = qianTai;
}
@Override
public void bossBack() {
System.out.println("我"+getName()+"回来了");
qianTai.bossBack();
}
}
package com.hj.designPattern.behavior.observer;
import java.util.ArrayList;
import java.util.List;
public class QianTai extends ZhiyuanParent implements BossBack{
List<ZhiyuanParent> zhiyuanList = new ArrayList<>();
public void add(ZhiyuanParent zhiyuan){
zhiyuanList.add(zhiyuan);
}
public void remove(ZhiyuanParent zhiyuan){
zhiyuanList.remove(zhiyuan);
}
public void init(){
ZhiyuanA zhiyuanA = new ZhiyuanA();
zhiyuanA.setName("小张");
ZhiyuanB zhiyuanB = new ZhiyuanB();
zhiyuanB.setName("小王");
zhiyuanList.add(zhiyuanA);
zhiyuanList.add(zhiyuanB);
}
@Override
public void bossBack() {
System.out.println("前台美美"+getName()+"在群里通知: 老板回来了");
for(ZhiyuanParent zhiyuan:zhiyuanList){
zhiyuan.bossBack();
}
}
}
package com.hj.designPattern.behavior.observer;
public class ZhiyuanA extends ZhiyuanParent implements BossBack {
@Override
public void bossBack() {
System.out.println("老板回来了,"+getName()+"关闭游戏");
}
}
package com.hj.designPattern.behavior.observer;
public class ZhiyuanB extends ZhiyuanParent implements BossBack{
@Override
public void bossBack() {
System.out.println("老板回来了,"+getName()+"关闭球赛");
}
}
3. 测试类
package com.hj.designPattern.behavior.observer;
public class ObserverTest {
public static void main(String[] args) {
Boss boss = new Boss();
boss.setName("胡汉三");
QianTai qianTai = new QianTai();
qianTai.setName("大美");
boss.setQianTai(qianTai);
qianTai.init();
boss.bossBack();
}
}