无废话设计模式(15)行为型模式--观察者模式
0-前言
观察者模式定义:定义了一种一对多的依赖关系让多个观察者对象同事监听某一主题对象。
这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己;
1-实现
1-1、简单UML图:
1-2、代码实现
//1、Sujcet抽象父类(通知者父类) abstract class ManSubject { private List<ManObserver> observers = new ArrayList(); //观察者列表 public String MyName; //名字 private String StateMessage; //要通知的消息 public ManSubject() { } //A、加入观察者 public void Attach(ManObserver _Observer) { observers.add(_Observer); } //B、通知 public void NotifyAll() { for (ManObserver item : observers) { item.Update(); } } //C、设置要通知的消息 public String getStateMessage() { return StateMessage; } public void setStateMessage(String stateMessage) { StateMessage = stateMessage; } } //1-1、具体通知者 class ManSubjectA extends ManSubject { public ManSubjectA() { this.MyName = "三弟(通知者)"; } } //---------------------------------------------------- //2、观察者父类 abstract class ManObserver { public String MyName; public ManSubject subject; public ManObserver(String _name,ManSubject _subject) { this.MyName = _name; this.subject = _subject; } //收到通知后更新自己 public abstract void Update(); } //2-1、具体观察者A class ManObserverA extends ManObserver { public ManObserverA(String _name,ManSubject _subject) { super(_name, _subject); } @Override public void Update() { System.out.println("---------------收到【"+subject.MyName+"】的消息【"+subject.getStateMessage()+"】"); System.out.println(MyName + "赶紧关闭了动画片去干活"); } } //2-2、具体观察者B class ManObserverB extends ManObserver { public ManObserverB(String _name,ManSubject _subject) { super(_name, _subject); } @Override public void Update() { System.out.println("---------------收到【"+subject.MyName+"】的消息【"+subject.getStateMessage()+"】"); System.out.println(MyName + "赶紧放下手机游戏去干活"); } }
客户端
//通知者 ManSubject manSubject = new ManSubjectA(); //观察者 ManObserver manObserverA = new ManObserverA("大姐",manSubject); ManObserver manObserverB = new ManObserverB("二哥",manSubject); //将观察者加入通知者中 manSubject.Attach(manObserverA); manSubject.Attach(manObserverB); //发布通知,通知各观察者 manSubject.setStateMessage("老爸拖着大棍子回来了"); manSubject.NotifyAll();
运行结果
2-应用场景简单总结
1、当一个模型的一方面必须依赖另一方面时;
2、当一个对象的改变需要同事改变多个对象时;
3、当一个对象必须通知其他对象,但又不能紧耦合时;