zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    
    

    执行结果:

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

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

    看关系图

  • 相关阅读:
    Python集成开发环境搭建
    Windows10 解决 “/”应用程序中的服务器错误
    Windows系统清除远程连接记录的方法
    C# 处理DateTime算法,取某月第1天及最后一天
    SQL语句
    3389远程连接爆破实战
    SQL Server常用SQL集合
    VS2013、VS2015中,新建项目没有看到解决方案的问题(已解决)
    我的黑苹果装机篇
    C# 使用GZip对字符串压缩和解压
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/6009750.html
Copyright © 2011-2022 走看看