知识大全 观察者模式 - 设计模式

Posted

篇首语:喜欢读书,就等于把生活中寂寞的辰光换成巨大享受的时刻。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 观察者模式 - 设计模式相关的知识,希望对你有一定的参考价值。

  观察者模式定义了一个一对多的对象关系 一个主体对象对应多个观察者对象 当主体对象发生改变时 所有它对应的观察者对象都会自动得到通知并更新

  本文将给出一个相应的事例具体说明观察者模式是如果工作的 这个事例演示了一个当一个任务的信息改变时通知这个任务所涉及所有人员的事例 任务信息包括任务状态 任务所采用的处理流程和任务完成后的checklist[用来确保任务完成所有预定需要完成的功能列表和避免一些常见的错误]

  先定义两个接口 主体对象接口和观察者对象接口

   /** *//** * 主体对象接口定义了注册观察者 取消观察者和通知观察者方法  * */public interface ISubject     /** *//**     * 为该主体对象注册一个观察者      */    public void registerObserver(IObserver observer);    /** *//**     * 从该主体对象中取消一个观察者的注册      */    public void removeObserver(IObserver observer);    /** *//**     * 通知所有观察者      */    public void notifyObserver();

   /** *//** * 观察者接口简单定义了一个用来更新观察者信息的接口  * 当主体对象被更新时 这个接口方法会被自动调用并更新信息  */public interface IObserver     /** *//**     * 接口方法用来更新观察者的信息      */    public void remind(ITask taskSubject);

  这两个接口只定义了主题对象和观察者对象所需要的接口 但是没有实现任何任务相关的具体的方法和接口 下面会再定义一个任务接口来规定任务应该具备的功能 这样分开定义的好处在于 如果我们将不同的模块分解开来 如果一方需要更新 另一方不会受到影响

   /** *//** * 这里定义了一个任务应该具有的功能  */public interface ITask     public void setStatus(String status);    public String getStatus();    public void setProcess(String process);    public String getProcess();    public void setCheckList(String checkList);    public String getCheckList();

  然后我们创建具体的任务主体 这里我们会实现ISubejct ITask两个接口

   import java util ArrayList;import java util List;public class TaskSubject implements ISubject  ITask     // 在这里对观察者列表进行初始化 因为是静态初始化 所以保证在这个运行过程中只有一个实例得到初始化     static         _observers = new ArrayList<IObserver>();        @Override    public void notifyObserver()         // 调用观察者的方法通知并更新观察者信息         for(IObserver observer : _observers)             observer remind(this);                @Override    public void registerObserver(IObserver observer)         if(ntains(observer))             System out println( <   + observer +   > is already registed! );                // Register an observer        _observers add(observer);        System out println( <   + observer +   > is registed successfully! );        @Override    public void removeObserver(IObserver observer)         if(!ntains(observer))             System out println( <   + observer +   > is never registed! );                // Remove an observer        _observers remove(observer);        System out println( <   + observer +   > is removed successfully! );        @Override    public String getCheckList()         return this _checkList;        @Override    public String getProcess()         return this _process;        @Override    public String getStatus()         return this _status;        @Override    public void setCheckList(String checkList)         this _checkList = checkList;        @Override    public void setProcess(String process)         this _process = process;        @Override    public void setStatus(String status)         this _status = status;        // 这里将观察者列表定义为一个静态的变量 这样可以保证自始至终只有一个变量列表 便于系统的维护     // 这里用到了泛型 这样在对这个列表进行操作的时候 无需再进行类型的转换     private static List<IObserver> _observers;    private String _status;    private String _process;    private String _checkList;

  在这里我们没有给观察者定义接口 而是使用了一个抽象类 因为所有的观察者都必须从主体对象那里获取信息 而且获取信息的方法都是一样的 这样可以避免重复编码

   /** *//** * 这个抽象类继承了Iobserver接口 所以我们必须实现remind方法  * 在remind方法中从主体对象中获取所有需要的信息  * 并调用sendEmail方法对观察者实时进行更新  */public abstract class TaskObserver implements IObserver     @Override    public void remind(ITask taskSubject)         this _status = taskSubject getStatus();        this _process = taskSubject getProcess();        this _checkList = taskSubject getCheckList();        // 更新观察者对象        this sendEmail();        public abstract void sendEmail();    // 工具类方法 减少编码数量 增加可读性     public void print(String msg)         System out println(msg);        // 在父类中定义参数 减少重复编码     protected String _status;    protected String _process;    protected String _checkList;

  然后定义任务受托人[assignee] 检查者 报告者 他们都继承TaskObserver类 这样减少了代码的重复 而且方便了代码的维护

   public class Assignee extends TaskObserver     @Override    public void sendEmail()         print( [Assignee] The current status is : <  + this _status +  > );        print( [Assignee] The current process is : <  + this _process +  > );        print( [Assignee] The current checklist is : <  + this _checkList +  > );        public String toString()         return  Assignee ;    public class Reviewer extends TaskObserver     @Override    public void sendEmail()         print( [Reviewer] The current status is : <  + this _status +  > );        print( [Reviewer] The current process is : <  + this _process +  > );        print( [Reviewer] The current checklist is : <  + this _checkList +  > );        public String toString()         return  Reviewer ;    public class Reporter extends TaskObserver     @Override    public void sendEmail()         print( [Reporter] The current status is : <  + this _status +  > );        print( [Reporter] The current process is : <  + this _process +  > );        print( [Reporter] The current checklist is : <  + this _checkList +  > );        public String toString()         return  Reporter ;    

  然后我们需要编写一个类用来演示观察者模式 在这个类中会演示注册观察者 取消特定观察者 更改主体对象信息然后观察者自动得到通知并更新信息

   public class TaskManager     public static void main(String[] args)         // Create subject        TaskSubject taskSubject = new TaskSubject();        // Create observers        IObserver assignee = new Assignee();        IObserver reviewer = new Reviewer();        IObserver reporter = new Reporter();        // 注册观察者[因为我们使用的是一个列表 所以在通知观察者的时候是按照添加的顺序通知的]        taskSubject registerObserver(assignee);        taskSubject registerObserver(reviewer);        taskSubject registerObserver(reporter);        // 更新主体对象的信息        taskSubject setStatus( Assigned );        taskSubject setProcess( No Process Attacted );        taskSubject setCheckList( CheckList Version  );        // 通知所有观察者        taskSubject notifyObserver();        // 更新主体对象信息        taskSubject setStatus( In Progress );        taskSubject setProcess( Process Attached );        taskSubject setCheckList( CheckList Version Final Version );        // 取消报告者的注册 并通知剩余所有观察者        taskSubject removeObserver(reporter);        taskSubject notifyObserver();    

  输出的信息如下

cha138/Article/program/Java/gj/201311/27595

相关参考

知识大全 java 设计模式之 观察者模式(Observer)

java设计模式之观察者模式(Observer)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 开发设计模式——asp.net中实现观察者模式

   在中实现观察者模式?难道中的观察者模式有什么特别么?嗯基于Http协议的Application难免有些健忘我是这样实现的不知道有没有更好的办法?  先谈谈需求吧以免

知识大全 php设计模式之观察者模式的应用详解

 代码如下:<?php//抽象主题interfaceSubjectpublicfunctionattach($observer);publicfunctiondetach($obser

知识大全 .net设计模式之观察者模式

  故事    小雪是一个非常漂亮的女孩漂亮的女孩总是有很多的追求者而且追求者的队伍在不断的变动随时有人进入这个队伍也有人退出男孩们追求女孩时总是表现出%的关心当小雪私自游玩时总是不断收到追求者询问小

知识大全 圣斗士星矢的状态模式和观察者模式

  星矢动画片《圣斗士星矢》的男猪脚超级小强怎么打也打不死  雅典娜动画片《圣斗士星矢》的女猪脚自称女神手下有个男人为他卖命  状态模式为了方便的控制状态的变化避免一堆IF/ELSE以及状态规则改变的

知识大全 爪哇语言观察者模式介绍

  简单地说观察者模式定义了一个一对多的依赖关系让一个或多个观察者对象监察一个主题对象这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象使这些观察者对象能够自动更新  观察者模式

知识大全 Java程序性能优化-观察者模式(3)

Java程序性能优化-观察者模式(3)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 Java程序性能优化-观察者模式(2)[2]

Java程序性能优化-观察者模式(2)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  图&

知识大全 Java程序性能优化-观察者模式(1)[2]

Java程序性能优化-观察者模式(1)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  pu

知识大全 Java程序性能优化-观察者模式(1)[1]

Java程序性能优化-观察者模式(1)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &n