zoukankan      html  css  js  c++  java
  • java设计模式-观察者模式学习

    最近学习了设计模式中的观察者模式,在这里记录下学习成果。

    观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到。只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察。

    引用大师的话就是

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

      观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    下面用代码展示

    1.新建接口 观察者 Observer 

    /**
     * 观察者
     * @author admin
     *
     */
    public interface Observer {
        public void update(String newState);
    }

      观察者对象非常简单,只需一个update方法,当被观察者动作时,会通知观察者,即触发update方法

    2.新建抽象类 Observable

    import java.util.ArrayList;
    import java.util.List;
    
    
    public abstract class Observable {
        //观察者集合
        private List<Observer> observerList = new ArrayList<Observer>();
    
        public List<Observer> getObserverList() {
            return observerList;
        }
    
        public void setObserverList(List<Observer> observerList) {
            this.observerList = observerList;
        }
        
        /**
         * 添加观察者对象
         * @param obs
         */
        public void attach(Observer obs){
            this.observerList.add(obs);
        }
        
        /**
         * 删除观察者对象
         * @param obs
         */
        public void detach(Observer obs){
            this.observerList.remove(obs);
        }
        
        /**
         * 动作的时候通知所有观察者
         */
        public void nodifyObservers(String newState){
            if(null!=observerList&&observerList.size()>0){
                for(Observer obs : observerList){
                    obs.update(newState);
                }
            }
        }
        
    }

    3.创建观察者的继承者 ObserverImpl 

    /**
     * 观察者的实现方法
     * @author admin
     */
    public class ObserverImpl implements Observer {
    
        /**
         * 当被观察者出现动作时触发
         */
        public void update(String newState) {
            System.out.println(newState);
        }
    }

    4.创建被观察者的子类 ObservableEx 

    public class ObservableEx extends Observable {
        
        /**
         * 当主体发生变化时,调用通知方法
         * @param newState
         */
        public void change(String newState){
            this.nodifyObservers(newState);
        }
        
    }

    5.创建客户端

    import org.junit.Test;
    
    public class Client {
        
        /**
         * 新建三个观察者,都把他们加到list中,然后调用change方法
         */
        @Test
        public void test(){
            Observer obs1 = new ObserverImpl();
            Observer obs2 = new ObserverImpl();
            Observer obs3 = new ObserverImpl();
            
            ObservableEx obse = new ObservableEx();
            obse.attach(obs1);
            obse.attach(obs2);
            obse.attach(obs3);
            
            obse.change("i am eating");
        }
    }

    运行后输出

    参见  http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

    http://www.blogjava.net/supercrsky/articles/202544.html

  • 相关阅读:
    插件模块与模块之间的通信(转)
    C#反射调用其它DLL的委托事件 传值
    单元测试
    c#实现动态加载Dll(转)
    Access sql语句创建表及字段类型(转)
    关于不同数据库表自动转换的功能
    通过DataTable获得表的主键
    C/s程序过时了吗?
    关于C/s结构 本地目录的思考
    关于创建人,创建日期,修改人,修改日期
  • 原文地址:https://www.cnblogs.com/Iqiaoxun/p/5492967.html
Copyright © 2011-2022 走看看