首页 > 学院 > 开发设计 > 正文

设计模式-观察者模式

2019-11-08 02:43:02
字体:
来源:转载
供稿:网友

不想当设计模式巨星的程序员不是好设计师。从本期开始我们对设计模式做一个系统性的总结。HeadFirst设计模式看了两遍。我尽量将书中的每个模式的重点提取出来,方便研读。

观察者模式在日常开发中经常用到-比如按钮的监听、网络返回数据状态的监听、文件下载的监听等,都可以用观察者模式来实现。那么观察模式到底是怎样定义的,其中有哪些注意点?我们通过一项例子再来认识观察者模式:

比如有这样一个情节--------订阅报纸:

1、报社提供的业务是出版报纸。

2、用户只要向报社订阅了报纸,报社在有新报纸出版时,就会将报纸送给用户。而且用户一定可以收到新的报纸。

3、当用户不想看报纸时,取消订阅,再有新报纸时,报社也不会向用户推送。

观察者模式就跟订阅报纸是一回事,只是名称不一样罢了。

图释:

定义观察者模式:定义一个对象和多个依赖。当一个对象改变时,他的所有依赖者都会收到通知,并自动更新。

观察者模式提供了一种这样的设计思想。对象和依赖者之间是松耦合。他们依然可以交互,但是不太清楚彼此的细节。松耦合的设计之所以能让我们建立有弹性的OO(面向对象)系统,能够应对变化,是因为他们之间相互依赖的降低。

结合具体代码做一个简单的讲解。

1、根据出版社(PRess)和读者朋友(Reader)两种角色来设计观察者模式,根据上文定义,出版社需要为读者朋友(Reader)提供三种功能:注册监听、取消监听、通知更新。读者朋友需要的技能是Reading。中间还需要一个观察者接口Observer来链接他们的状态更新。所以需要设计这样三个接口:

出版社接口

public interface ipress{    public void registerObserver(Observer o);//注册观察者    public void removeObserver(Observer o);//删除观察者    public void notifyObservers();//通知更新}

阅读者接口

public interface IReader(){    public void  reading();//阅读者只有一个阅读功能}

观察者接口
public interface IObserver{  public void updata(String date,String  content);}

2、依据上面接口,结合实际需求,写出相应实现。

出版社

public class PressData implements IPress{    private ArrarList observers;    private String date;    private String content;    public PressData(){        observers=new ArrarList<IObserver>();    }    @Override    public void registerObserver((Observer o){        observers.add(o);    }    @Override    public void removeObserver(IObserver o){        int i=observers.indexOf(o);        if(i>=0){            observers.remove(i);        }    }    @Override    public void notifyObservers(){        for(int i=0;i<observers.size();i++){            IObserver observer=(IObserver)observers.get(i);            observer.updata(date,content);        }    }    public void setNewsData(String date,String content){        this.date=data;        this.content=content;        notifyObservers;    }}

阅读者

public class Reader implements IObserver,IReader{    private String date;    private String content;    private PressData pressData;    public Reader(PressData pressData){        this.pressData=pressData;        this.pressData.registerObserver(this);    }    @Override    public void updata(date,content){        this.date;        this.content=content;        reading(date,content);    }    @Override    public void reading(){        System.out.println("News----"+date+"----"+content);    }}

3、具体调用

public class ReadingStation(){    public static void main(String[] args){            PressData pressData=new PressData();        Reader reader=new Reader(pressData);        pressData.setNewsData("20170220","观察者模式");    }}

这里定义的观察者模式可能跟我们已经用到的不太一样。或许你会觉得稍微复杂了一点,怎么会这么多类?。。。实际确实如此,这里写的稍微松耦合了一下。实际我们之前写的时候一个类就搞定了。那么根据书中介绍的,再次强调,我们要注重松耦合。当然只定义一个Oberver去掉注册和取消监听的方法,我们直接实现Oberver类,然后传入调用接口行了,这样的情况也是有的。但是上面的例子确实值得思考。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表