观察者模式!

来源:互联网 发布:中国近几年进出口数据 编辑:程序博客网 时间: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

0 0
原创粉丝点击