设计模式之观察者模式
来源:互联网 发布:乐乎城市青年社区租房 编辑:程序博客网 时间:2024/06/04 20:10
参考《大话设计模式》
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够更新自己。
有以下两个关系:
通知者->“前台”通知者,来通知观察者
观察者-> 具体实现类,可以是员工<->老板关系中的员工,可以是学生<->老师关系中的学生,而老师或者通知学生的班干部就是通知者。
观察者模式结构图
*Subject,抽象通知者,一般用一个抽象类或者接口实现。*
public interface Subject { void Attach(Observer observer); void Detach(Observer observer); void Notify(); String getSubjectState(); void setSubjectState();}
*Subject具体通知者类,比如老板或通知其他观察者的员工通知类。*
public class ConcreteSubject implements Subject{ private ArrayList<Observer> observers = new ArrayList<Observer>(); private String action; //Add Observer @Override public void Attach(Observer observer) { observers.add(observer); } //remove observer @Override public void Detach(Observer observer) { observers.remove(observer); } //Notify @Override public void Notify() { for (Observer o : observers) { o.Update(); } } //状态,通知类的状态,比如书中实例2的老板或前台。 @Override public String getSubjectState() { return action; } @Override public void setSubjectState(String action) { this.action = action; }}
*Observer抽象类或接口*
public interface Observer { void Update();}
Observer具体实现类1
public class ConcreteObserver1 implements Observer { private String name; private Subject subject; public ConcreteObserver1(String name, Subject subject) { this.name = name; this.subject = subject; } @Override public void Update() { System.out.println(subject.getSubjectState()+" is comeback "+name+" should do something rightly"); }}
Observer具体实现类2
public class ConcreteObserver2 implements Observer { private String name; private Subject subject; public ConcreteObserver2(String name, Subject subject) { this.name = name; this.subject = subject; } @Override public void Update() { System.out.println(subject.getSubjectState()+" is comeback "+name+" should do something rightly"); }}
客户端代码
public class Client { public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject(); ConcreteObserver1 concreteObserver1 = new ConcreteObserver1("张三", concreteSubject); ConcreteObserver2 concreteObserver2 = new ConcreteObserver2("李四", concreteSubject); concreteSubject.Attach(concreteObserver1); concreteSubject.Attach(concreteObserver2); concreteSubject.Detach(concreteObserver2);//如果concrete没有被concreteSubject通知到 //concreteSuject回来了, concreteSubject.setSubjectState("老板回来..."); //应该要发出通告了 concreteSubject.Notify(); }}
最后输出
老板回来... is comeback 张三 should do something rightly
原书中观察者模式代码解释部分,它具体的实现类ConcreteObserver还是和具体类ConcreteSubject耦合在一起了,没有依赖于抽象。看的我有点懵逼,不知道是不是我弄错了,总之观察者模式看了好久才看懂了这个套路。以上我根据前面的实例修改了观察者模式的代码,如有错误之处,望指出。后续,解释Java委托事件的和C#的不同和Java委托事件的实现。
有关Java委托事件的实现:
http://blog.csdn.net/shuciqi/article/details/25706325
和反射机制:
百度百科:
http://baike.baidu.com/link?url=Y_KjRKQ9YRgTS58PW02ePkfCXoIpdMXSC-yFsb_lbXYllXHREznKWLRMa_QlJ_OLaIJ3ZrU-XkkDQgftmif5DZDlkbcRPEgVCQ76PedItWk9ueVotThWg66uignZOZ8TwS1LqzTupwA5OEOnCe75w_
参考blog:
http://www.cnblogs.com/lzq198754/p/5780331.html
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 关于解决DockManager如何停靠在其他布局控件问题
- 大数据处理题型分析
- C++模板实现归并排序
- JAVA-练习MyShopping查询商品价格
- 最佳的MongoDB客户端管理工具
- 设计模式之观察者模式
- 单例模式-单例模式调用普通类,普通类也可以实现单例模式
- 浏览器重绘和重排
- JAVA-练习Shopping_settlement升级购物结算
- Retrofit2+Okhttp3+Rxjava2通过SOAP协议请求WebService
- 题目1198:a+b 九度OJ
- 关于spring mvc配置文件上传
- 递推算法应用--数塔问题
- TensorFlow Playground