观察者模式!
来源:互联网 发布:中国近几年进出口数据 编辑:程序博客网 时间:2024/05/01 14:04
放弃该放弃的是无奈,放弃不该放弃的是无能,不放弃该放弃的是无知,不放弃不该放弃的是执著!
今天,我们学习设计模式中的观察者模式,我们先不说何为观察者模式,我们先来举个生活中的列子,比如,你在街上看到一个美女,但是你不好意思上去要电话,打招呼,于是你就一直在盯着她,然后姑娘也发现了你,看你小伙子还不错,于是给你一个颜色,意思是说他对你感觉还行,这时你有了信心,然后你上去成功的勾搭上了妹子。这其实就是我们接下来要说的观察者模式,你就是观察者,美女就是被观察者,美女给了你个信号,于是你就做出了动作。OK!
下面我们来先看一下观察者模式的定义和好处,懂的人可以直接看代码!
定义:
定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。当然,一个被观察者(Observable)能有多个观察者(Observer),一个观察者也可以观察多个被观察者。是不是感觉很简单呢??
现在我们就以开篇的列子稍作修改来写一个观察这模式的例子:
比如很多男孩子都在追一个女孩子,女孩子给了他们一个眼色,所有的男孩子都上去嘘寒问暖。
我们先写观察者对象(Observer),我们的Boy
public class Boy { private String name; private int id; public Boy(String name, int id) { this.name = name; this.id = id; } public void update() { System.out.println(this.id+this.name+"说:女孩,能要个电话吗?"); }}
接下来是我们的被观察者(Observable),我们的girl。
public class Girl { private List<Boy> observerList = new ArrayList<>(); public void add(Boy boy){ observerList.add(boy); } public void notification(){ System.out.println("妹子说:妹子我看你们挺不错的!"); for(int i = 0 ;i < observerList.size();i++){ observerList.get(i).update(); } }}
然后我们执行代码在这里:
public class Main { public static void main(String[] args) { Boy zhangsan = new Boy("张三", 1); Boy wangwu = new Boy("王五", 2); Boy lisi = new Boy("李四", 3); Girl girl = new Girl(); girl.add(zhangsan); girl.add(wangwu); girl.add(lisi); girl.notification(); }}
哈哈,是不是很简单,我们再看看运行结果吧!
妹子说:妹子我看你们挺不错的!1张三说:女孩,能要个电话吗?2王五说:女孩,能要个电话吗?3李四说:女孩,能要个电话吗?
我们是不是实现了我们的例子?简单吧!对观察者模式就是这么简单,第一次看的话可能不好理解,但是多看几次,你的思想就会扩散开来,能深入理解。
其实,JDK中给我们封装好了Observer和Obervable,我们只需要继承便可完成我们的观察者模式,在学习之前,我们来张美图放松一下。
接下来,我们看使用JDK里面的Observer和Observable是何等的简单。
首先Observer是个接口,我们只需要实现里面的update()方法即可
@Override public void update(Observable o, Object arg) { } o:你观察的那个被观察者对象 arg:被观察者给你传过来的参数
而Observable是一个父类。我们可以很轻松的调用和重写里面的方法
下面是我们可以调用和重写的方法:
Observable()addObservable(Observer o)deleteObservable(Observer o)notifyObservers()notifyObservers(Object args)deleteObservers();setChanged();clearChanged();hasChanged();CounObservers();
方法很简单,看意思就能猜出方法的意思和用途:
那么下面我们来举个例子:
比如说,如果你一个月的工资在一万以上,你女朋友每个月给你100块钱零花钱,但是你一个月的工资在一万以下,你女朋友每个月给你50块钱零花钱,啊,是够苛刻的!!!
我们看一下在你赚的钱少于10000 的代码:
先看女朋友的代码:
public class Girl extends Observable { private int MyCount; public void notifycation(int MyCount) { if (MyCount > 10000) { setChanged(); notifyObservers(100); } else { setChanged(); notifyObservers(50); } }}
接下来是描述你的代码:
public class Boy implements Observer { private int salary; public int getSalary() { return salary; } public Boy(int salary) { this.salary = salary; } @Override public void update(Observable o, Object arg) { System.out.println("我这个月的零花钱为" + arg); }}
接下来我们看你的工资少于10000时候的主工程!
public class Main { public static void main(String[] args) { Boy boy = new Boy(8000); Girl girl = new Girl(); girl.addObserver(boy); girl.notifycation(boy.getSalary()); }}
Ok,写到这里我们就搞定了,我们看下运行结果:
我这个月的零花钱为50
那么我们将钱改个数大于10000呢?
public class Main { public static void main(String[] args) { Boy boy = new Boy(12000); Girl girl = new Girl(); girl.addObserver(boy); girl.notifycation(boy.getSalary()); }}
看下结果
我这个月的零花钱为100
Ok,写完了,是不是很简单,从上面的列子中不但能学到观察者模式,还能看出只要你多多赚钱,你女朋友还是挺好的,哈哈哈哈!!!!
好了,讲完了,来张美图休息一下吧。源码在底部给出
源码地址:https://github.com/xingege662/ObservePattern
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- poj2718(子集生成)
- 【技巧】数组作为另一个数组的下标
- 实验记录:Oracle redo logfile的resize过程
- Ubuntu PPA用法简介
- ML-kNN 多标签k近邻算法
- 观察者模式!
- V4L2框架分析学习
- [leetcode]Binary Tree Maximum Path Sum
- RadioButton和CheckBox
- 59. web 攻击技术(3)
- HashMap源码解析-jdk8
- POJ_2386_Lake Counting
- CSDN-markdown编辑器快捷方式
- mysql数据库配置