我用图来说设计模式一(观察者模式)
2016-02-28 21:55
309 查看
作为一名程序员,不知道设计模式那我们只能是每个挣一些饿不死的工资,外加一个牛B的IT名号。
所以认识设计模式势在必行,但没必要全部指导,需要大家一步一步的来认识。
总体来说:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
常见的开发模式:
1. 观察者模式
2. 适配器模式
3. 列表内容
4. 工厂模式
5. 代理模式
6. 单例模式
7. 命令模式
8. ……
1.观察者模式(Observer Pattern)
what:
Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
以上是百度百科的解释。
Observier模式在执行时就好比小偷与保安的关系,被观察者就是小偷,观察者就是保安。只要小偷一出手,保安就立马做出反映。
就如上图所示,保安时刻在观察小偷,只要小偷一有偷这个动作,那么马上被通知到。
观察者模式主要有观察者和被观察者2个对象,在该模式中,Observable表示被观察者,这个对象是一个抽象类,只能被继承。 Observer表示观察者,他是一个接口,所以观察者可以有多个,实现了该接口的类都是属于观察
好了,废话少说,上代码。
这个是被观察者,来看看,他有两个很牛B的父类代码:
//告诉后台数据发生变化了
setChanged();
//告诉观察者可以开始行动了
notifyObservers();
呵呵 ,很明白了,不多说了 ,看完整代码吧。
这里是观察者代码。
观察者代码实现了Observer接口,重写了update方法,当调用被观察者被调用了notifyObservers()后,那update方法就被执行了。
综合上述,观察者模式很好的解决了当数据放生变化时,更新所有相关的当事人。
所以认识设计模式势在必行,但没必要全部指导,需要大家一步一步的来认识。
总体来说:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
常见的开发模式:
1. 观察者模式
2. 适配器模式
3. 列表内容
4. 工厂模式
5. 代理模式
6. 单例模式
7. 命令模式
8. ……
1.观察者模式(Observer Pattern)
what:
Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
以上是百度百科的解释。
Observier模式在执行时就好比小偷与保安的关系,被观察者就是小偷,观察者就是保安。只要小偷一出手,保安就立马做出反映。
就如上图所示,保安时刻在观察小偷,只要小偷一有偷这个动作,那么马上被通知到。
观察者模式主要有观察者和被观察者2个对象,在该模式中,Observable表示被观察者,这个对象是一个抽象类,只能被继承。 Observer表示观察者,他是一个接口,所以观察者可以有多个,实现了该接口的类都是属于观察
好了,废话少说,上代码。
这个是被观察者,来看看,他有两个很牛B的父类代码:
//告诉后台数据发生变化了
setChanged();
//告诉观察者可以开始行动了
notifyObservers();
呵呵 ,很明白了,不多说了 ,看完整代码吧。
package com.tedu.zab.observermode; import java.util.Observable; public class MyPerson extends Observable { private int age; private String name; private String sax; public int getAge() { return age; } public void setAge(int age) { this.age = age; //告诉后台数据发生变化了 setChanged(); //告诉观察者可以开始行动了 notifyObservers(); } public String getName() { return name; } public void setName(String name) { this.name = name; //告诉后台数据发生变化了 setChanged(); //告诉观察者可以开始行动了 notifyObservers(); } public String getSax() { return sax; } public void setSax(String sax) { this.sax = sax; } @Override public String toString() { return "MyPerson [age=" + age + ", name=" + name + ", sax=" + sax + "]"; } }
这里是观察者代码。
观察者代码实现了Observer接口,重写了update方法,当调用被观察者被调用了notifyObservers()后,那update方法就被执行了。
package com.tedu.zab.observermode; import java.util.Observable; import java.util.Observer; public class MyObserver implements Observer { private int i; private MyPerson myPerson;//观察的对象 public MyObserver(int i){ System.out.println("我是观察者---->" + i); this.i = i; } public int getI() { return i; } public void setI(int i) { this.i = i; } public MyPerson getMyPerson() { return myPerson; } public void setMyPerson(MyPerson myPerson) { this.myPerson = myPerson; } @Override public void update(Observable observable, Object data) { System.out.println("观察者---->"+ i +"得到更新!"); this.myPerson = (MyPerson)observable; System.out.println(((MyPerson)observable).toString()); } }
综合上述,观察者模式很好的解决了当数据放生变化时,更新所有相关的当事人。
相关文章推荐
- 重新定义技术团队
- win32应用程序和win32控制台应用程序
- 程序开发使用第三方库需要小心再小心
- Obstacks的简单使用
- linux 安全增强的经典模型
- 程序开发使用第三方库需要小心再小心
- bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)
- 2016年总——不忘初心
- STL 中的容器们 (二)
- 数据挖掘
- JDBC中如何获取java.sql.Array的值
- CH02:提供推荐
- https://projecteuler.net/problem=11
- Linux精讲——du命令
- CF EDU #8 D - Magic Number
- HDOJ 1215 七夕节
- 毕业设计准备
- Linux Mint (应用软件— 虚拟机:Virtualbox续)
- 理解Struts2的Action中的setter方法是怎么工作的
- HDOJ 1215 七夕节