美文网首页
观察者模式

观察者模式

作者: 起嚸_ | 来源:发表于2018-03-07 14:38 被阅读0次
/** 
 * 主题接口,所有的主题必须实现此接口 
 *  
 * @author zhy 
 *  
 */  
public interface Subject{  
    /** 
     * 注册一个观察着 
     *  
     * @param observer 
     */  
    public void registerObserver(Observer observer);  
  
    /** 
     * 移除一个观察者 
     *  
     * @param observer 
     */  
    public void removeObserver(Observer observer);  
  
    /** 
     * 通知所有的观察着 
     */  
    public void notifyObservers();  
  
} 
/** 
 * @author zhy 所有的观察者需要实现此接口 
 */  
public interface Observer{  
    public void update(String msg);  
  
} 
public class ObjectFor3D implements Subject  
{  
    private List<Observer> observers = new ArrayList<Observer>();  
    /** 
     * 3D彩票的号码 
     */  
    private String msg;  
  
    @Override  
    public void registerObserver(Observer observer)  
    {  
        observers.add(observer);  
    }  
  
    @Override  
    public void removeObserver(Observer observer)  
    {  
        int index = observers.indexOf(observer);  
        if (index >= 0)  
        {  
            observers.remove(index);  
        }  
    }  
  
    @Override  
    public void notifyObservers()  
    {  
        for (Observer observer : observers)  
        {  
            observer.update(msg);  
        }  
    }  
  
    /** 
     * 主题更新消息 
     *  
     * @param msg 
     */  
    public void setMsg(String msg)  
    {  
        this.msg = msg;  
          
        notifyObservers();  
    }  
  
}
public class Observer1 implements Observer  
{  
  
    private Subject subject;  
  
    public Observer1(Subject subject)  
    {  
        this.subject = subject;  
        subject.registerObserver(this);  
    }  
  
    @Override  
    public void update(String msg)  
    {  
        System.out.println("observer1 得到 3D 号码  -->" + msg + ", 我要记下来。");  
    }  
  
} 
public class Observer2 implements Observer  
{  
    private Subject subject ;   
      
    public Observer2(Subject subject)  
    {  
        this.subject = subject  ;  
        subject.registerObserver(this);  
    }  
      
    @Override  
    public void update(String msg)  
    {  
        System.out.println("observer2 得到 3D 号码 -->" + msg + "我要告诉舍友们。");  
    }  
}  
public class Test  
{  
    public static void main(String[] args)  
    {  
        //模拟一个3D的服务号  
        ObjectFor3D subjectFor3d = new ObjectFor3D();  
        //客户1  
        Observer observer1 = new Observer1(subjectFor3d);  
        Observer observer2 = new Observer2(subjectFor3d);  
  
        subjectFor3d.setMsg("20140420的3D号码是:127" );  
        subjectFor3d.setMsg("20140421的3D号码是:333" );  
          
    }  
}  

下面我们使用Java内置的类实现观察者模式:

public class SubjectFor3d extends Observable  
{  
    private String msg ;   
      
      
    public String getMsg()  
    {  
        return msg;  
    }  
  
  
    /** 
     * 主题更新消息 
     *  
     * @param msg 
     */  
    public void setMsg(String msg)  
    {  
        this.msg = msg  ;  
        setChanged();  
        notifyObservers();  
    }  
}  
public class SubjectForSSQ extends Observable  
{  
    private String msg ;   
      
      
    public String getMsg()  
    {  
        return msg;  
    }  
  
  
    /** 
     * 主题更新消息 
     *  
     * @param msg 
     */  
    public void setMsg(String msg)  
    {  
        this.msg = msg  ;  
        setChanged();  
        notifyObservers();  
    }  
}
public class Observer1 implements Observer  {  
  
    public void registerSubject(Observable observable)  
    {  
        observable.addObserver(this);  
    }  
  
    @Override  
    public void update(Observable o, Object arg)  
    {  
        if (o instanceof SubjectFor3d)  
        {  
            SubjectFor3d subjectFor3d = (SubjectFor3d) o;  
            System.out.println("subjectFor3d's msg -- >" + subjectFor3d.getMsg());  
        }  
  
        if (o instanceof SubjectForSSQ)  
        {  
            SubjectForSSQ subjectForSSQ = (SubjectForSSQ) o;  
            System.out.println("subjectForSSQ's msg -- >" + subjectForSSQ.getMsg());  
        }  
    }  
}  
public class Test  {  
    public static void main(String[] args)  
    {  
        SubjectFor3d subjectFor3d = new SubjectFor3d() ;  
        SubjectForSSQ subjectForSSQ = new SubjectForSSQ() ;  
          
        Observer1 observer1 = new Observer1();  
        observer1.registerSubject(subjectFor3d);  
        observer1.registerSubject(subjectForSSQ);  
          
          
        subjectFor3d.setMsg("hello 3d'nums : 110 ");  
        subjectForSSQ.setMsg("ssq'nums : 12,13,31,5,4,3 15");  
          
    }  
} 

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

      本文链接:https://www.haomeiwen.com/subject/rcmjfftx.html