大话设计模式-观察者模式
来源:互联网 发布:怪物猎人捏脸数据 编辑:程序博客网 时间:2024/06/05 16:21
本文转载自点击打开链接
需求
设计一个前台通知同事老板回来了的程序。
实现
级别1
import java.util.*;//前台秘书类 public class Secretary { private List<StockObserver> observers = new ArrayList<StockObserver>(); private String action; public void attach(StockObserver observer) { observers.add(observer); } public void announce() { for (StockObserver obj : observers) { obj.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
//看股票同事类 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(sub.getAction() + " " + name + "关闭股票行情,继续工作!"); } }
public class Main { public static void main(String[] args) { // 前台小组童子喆 Secretary tongzizhe = new Secretary(); // 看股票的同事 StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe); StockObserver tongshi2 = new StockObserver("易管查", tongzizhe); //前台记下了两位同事 tongzizhe.attach(tongshi1); tongzizhe.attach(tongshi2); //发现老板回来 tongzizhe.setAction("老板回来了!"); //通知两个同事 tongzizhe.announce(); } }前台和看股票者互相耦合,前台类要增加观察者,观察者类需要前台的状态。
级别2
//抽象的观察者 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(); }
public class StockObserver extends Observer { public StockObserver(String name, Secretary sub) { super(name, sub); } public void update() { System.out.println(sub.getAction() + " " + name + "关闭股票行情,继续工作!"); } }
public class NBAObserver extends Observer { public NBAObserver(String name, Secretary sub) { super(name, sub); } public void update() { System.out.println(sub.getAction() + " " + name + "关闭NBA直播,继续工作!"); } }
import java.util.*;//前台秘书类 public class Secretary { private List<Observer> observers = new ArrayList<Observer>(); private String action; public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void announce() { for (Observer obj : observers) { obj.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
public class Main { public static void main(String[] args) { // 前台小组童子喆 Secretary tongzizhe = new Secretary(); // 看股票的同事 StockObserver tongshi1 = new StockObserver("魏关姹", tongzizhe); NBAObserver tongshi2 = new NBAObserver("易管查", tongzizhe); //前台记下了两位同事 tongzizhe.attach(tongshi1); tongzizhe.attach(tongshi2); //发现老板回来 tongzizhe.setAction("老板回来了!"); //通知两个同事 tongzizhe.announce(); } }前台秘书是一个具体的类,也应该抽象出来。
级别3
//通知者接口 public interface Subject { void attach(Observer observer); void detach(Observer observer); void announce(); String getAction(); void setAction(String action); }
import java.util.*;public class Secretary implements Subject { private List<Observer> observers = new ArrayList<Observer>(); private String action; public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void announce() { for (Observer obj : observers) { obj.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
import java.util.*;public class Boss implements Subject { private List<Observer> observers = new ArrayList<Observer>(); private String action; public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void announce() { for (Observer obj : observers) { obj.update(); } } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
//抽象的观察者 public abstract class Observer { protected String name; protected Subject sub; public Observer(String name, Subject sub) { this.name = name; this.sub = sub; } public abstract void update(); }
public class StockObserver extends Observer { public StockObserver(String name, Subject sub) { super(name, sub); } public void update() { System.out.println(sub.getAction() + " " + name + "关闭股票行情,继续工作!"); } }
public class NBAObserver extends Observer { public NBAObserver(String name, Subject sub) { super(name, sub); } public void update() { System.out.println(sub.getAction() + " " + name + "关闭NBA直播,继续工作!"); } }
public class Main { public static void main(String[] args) { // 老板胡汉三 Boss huhansan = new Boss(); // 看股票的同事 StockObserver tongshi1 = new StockObserver("魏关姹", huhansan); // 看NBA的同事 NBAObserver tongshi2 = new NBAObserver("易管查", huhansan); huhansan.attach(tongshi1); huhansan.attach(tongshi2); huhansan.detach(tongshi1); // 老板回来了 huhansan.setAction("我胡汉三回来了!"); huhansan.announce(); } }观察者模式又叫发布-订阅模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
//Subject类public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void announce() { for (Observer obj : observers) { obj.update(); } }} //Observer类public abstract class Observer { public abstract void update(); } //ConcreteSubject类public class ConcreteSubject extends Subject { private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } } //ConcreteObserver类 public class ConcreteObserver extends Observer { private String name; private String observerState; private ConcreteSubject subject; public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } public void update() { observerState = subject.getSubjectState(); System.out.println("观察者" + name + "的新状态是" + observerState); } public ConcreteSubject getSubject() { return subject; } public void setSubject(ConcreteSubject subject) { this.subject = subject; } } //客户端代码 public class Main { public static void main(String[] args) { ConcreteSubject s = new ConcreteSubject(); s.attach(new ConcreteObserver("X", s)); s.attach(new ConcreteObserver("Y", s)); s.attach(new ConcreteObserver("Z", s)); s.setSubjectState("ABC"); s.announce(); } }
0 0
- 大话设计-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-----观察者模式
- 大话设计模式----观察者模式
- 大话设计模式之观察者模式
- 【大话设计模式】——观察者模式
- 【大话设计模式系列】之观察者模式
- 大话设计模式之观察者模式
- 《大话设计模式》 -- 13.观察者模式
- 大话设计模式之观察者模式
- linkin大话设计模式--观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式—观察者模式
- 大话设计模式java版--观察者模式
- Jquery认识 和 jQuery教程
- 项目中关于内存管理的问题
- 杭州--4.6
- 设计模式入门
- React Native 开源组件
- 大话设计模式-观察者模式
- 字符串相关内容整理
- 第六周上机实践项目——项目2-带武器的游戏角色
- Android Preference类中xml里属性的用法和介绍
- JavaScript setTimeOut方法与setInterval方法使用
- 5种常见排序方法深度剖析
- view 坐标
- 扩展性和存储限制
- 海洋浮标数据显示系统