• JAVA设计模式之【观察者模式】


    观察者模式
    	交通信号灯是汽车的观察目标,汽车是观察者
    	一个对象的状态或行为的变化将导致其他对象的状态或行为也发生变化
    	为了描述这种一对多或一对一的联动,观察者模式应运而生
    	在观察者模式中,发生改变的对象成为观察目标,而被通知的对象成为观察者。一个观察目标可以对应多个观察者。
    	别名
    		发布与订阅模式
    		模型与视图模式
    		源监听模式
    		从属者模式
    	角色
    		Subject目标、主题、被观察对象
    			定义观察者集合
    			提供方法增加和删除观察者对象
    			定义通知方法notify
    			可以是接口、抽象类或具体类
    		ConcreteSubject具体目标
    			包含经常发生改变的数据
    			状态改变向观察者发出通知
    		Observer观察者
    			对观察目标的改变做出反应
    			声明更新数据的方法update
    		ConcreteObserver具体观察者
    			存储具体观察者的状态
    			实现update方法
    			调用目标类的attach方法,加入集合
    			或通过detach方法将自己从目标类的集合中删除
    
    

    看例子
    1.抽象观察目标

    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    import java.util.*;
    
    public abstract class MySubject
    {
        protected ArrayList observers = new ArrayList();
    
        //注册方法
        public void attach(MyObserver observer)
        {
            observers.add(observer);
        }
    
        //注销方法
        public void detach(MyObserver observer)
        {
            observers.remove(observer);
        }
    
        public abstract void cry(); //抽象通知方法
    }
    

    2.具体观察目标,猫

    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    public class CatSubject extends MySubject{
        public void cry() {
            System.out.println("猫叫!");
            System.out.println("----------------------");
            for(Object obj:observers) {
                ((MyObserver)obj).response();
            }
        }
    }
    
    

    3.抽象观察者

    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    public interface MyObserver
    {
        void response();  //抽象响应方法
    }
    

    4.具体观察者

    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    public class DogObserver implements MyObserver{
        public void response() {
            System.out.println("狗跟着叫!");
        }
    }
    
    
    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    public class PigObserver implements MyObserver{
        public void response() {
            System.out.println("猪也哄哄乱叫!");
        }
    }
    
    

    5.调用过程

    package Observer;
    
    /**
     * Created by Jiqing on 2016/10/28.
     */
    public class Client {
        public static void main(String a[])
        {
            MySubject subject=new CatSubject();
    
            MyObserver obs1,obs2;
            obs1=new DogObserver();
            obs2=new PigObserver();
    
            subject.attach(obs1);
            subject.attach(obs2);
    
            subject.cry();
        }
    }
    
    

    执行结果:

    猫叫!
    ----------------------
    狗跟着叫!
    猪也哄哄乱叫!
    

    点评:
    猫叫带动狗叫和猪叫~
    例子不在于多复杂,在于能把概念阐述清晰。

    看关系图

  • 相关阅读:
    Linq 中 表连接查询
    Html Div 拖拽
    持续集成:TestNG中case之间的关系
    测试技术培训:如何测试磁盘写的速度
    POPTEST 测试开发 免费培训课程报名
    接上文 下面是一段示例代码
    老李分享:android手机测试之适配(1)
    (转)POPTEST创始人李爱然:谢谢,帮助我的朋友!!!!
    性能调优之SQL优化
    大数据测试之Hadoop的基本概念
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/6009750.html
Copyright © 2020-2023  润新知