zoukankan      html  css  js  c++  java
  • 设计模式——观察者模式

        HeadFirst中对观察者模式的定义:观察者模式定义了对象之间的一对多的依赖,这样一来,当一个状态发生变化时,它的所有依赖者都会收到通知并自动更新。

       松耦合:当两个对象时间松耦合,它们依然可以交互,但是不太清楚彼此的细节。

       观察者模式提供了一种对象设计,让主题和观察者之间的松耦合。

       有两种自动更细的方式,主题推送给每个观察者或者观察者从主题中拉取。

       Java中内置了观察者模式,可以很方便的写出代码。

       自己写了两个Demo,一个是自己实现,一个是借助Java中的实现。

      Demo1:

     

    package com.wxisme.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 主题接口
     * @author wxisme 
     * 
     */
    
    public interface Subject {
    	List<Observer> observerList = new ArrayList<>();
    	void registerObserver(Observer observer);
    	void removeObserver(Observer observer);
    	void notifyObserver();
    }
    
    package com.wxisme.observer;
    /**
     * 观察者接口
     * @author wxisme
     */
    public interface Observer {
    	void update(Subject subject);
    
    }
    
    package com.wxisme.observer;
    /**
     * 具体的主题对象,实现主题接口
     * @author wxisme
     *
     */
    public class ConcreteSubject implements Subject {
    	
    	private int state;
        
    	@Override
    	public void registerObserver(Observer observer) {
    		ConcreteSubject.observerList.add(observer);
    	}
    	
    	@Override
    	public void removeObserver(Observer observer) {
    		ConcreteSubject.observerList.remove(observer);
    	}
    	@Override
    	public void notifyObserver() {
    		for(int i=0; i<ConcreteSubject.observerList.size(); i++) {
    			ConcreteSubject.observerList.get(i).update(this);
    		}
    	}
    	
    	public void changed() {
    		this.notifyObserver();
    	}
    	public int getState() {
    		return state;
    	}
    	//当具体的主题对象的状态改变时,会调用notify()方法,通知每个在此主题注册了的观察者。
    	public void setState(int state) {
    		this.state = state;
    		this.changed();
    	}
    
    }
    
    package com.wxisme.observer;
    /**
     * 具体的观察者,实现观察者接口。
     * @author wxisme
     *
     */
    public class ConcreteObserver implements Observer {
    	private int myState;
    	@Override
    	public void update(Subject subject) {
    		setMyState(((ConcreteSubject)subject).getState());
    		System.out.println("myState changed:" + myState);
    	}
    	
    	public int getMyState() {
    		return myState;
    	}
    
    	public void setMyState(int myState) {
    		this.myState = myState;
    	}
    }
    
    package com.wxisme.observer;
    /**
     * 测试观察者模式
     * @author wxisme
     */
    public class Demo {
    
    	public static void main(String[] args) {
    		//一个主题对应多个观察者
    		ConcreteSubject csbj = new ConcreteSubject();
    		ConcreteObserver cobs1 = new ConcreteObserver();
    		csbj.registerObserver(cobs1);
    		ConcreteObserver cobs2 = new ConcreteObserver();
    		csbj.registerObserver(cobs2);
    		ConcreteObserver cobs3 = new ConcreteObserver();
    		csbj.registerObserver(cobs3);
    		//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。
    		csbj.setState(20);
    		System.out.println("------------------");
    		csbj.setState(400);
    		
    	}
    
    }
    

     运行结果:

      myState changed:20
      myState changed:20
      myState changed:20
      ------------------
      myState changed:400
      myState changed:400
      myState changed:400

    package com.wxisme.javaobserver;
    
    import java.util.Observable;
    
    public class ConcreteSubject extends Observable {
    	private int state;
    	
    	public int getState() {
    		return state;
    	}
    	public void setState(int state) {
    		this.state = state;
    		setChanged();
    		notifyObservers(state);
    	}
    }
    
    package com.wxisme.javaobserver;
    
    import java.util.Observable;
    import java.util.Observer;
    
    public class ConcreteObserver implements Observer {
    	private int myState;
    	@Override
    	public void update(Observable obs, Object obj) {
    		setMyState(((ConcreteSubject)obs).getState());
    		System.out.println("myState changed:" + myState);
    	}
    	
    	public void setMyState(int myState) {
    		this.myState = myState;
    	}
    
    	public int getMyState() {
    		return myState;
    	}
    }
    
    package com.wxisme.observer;
    /**
     * 测试观察者模式
     * @author wxisme
     */
    public class Demo {
    
    	public static void main(String[] args) {
    		//一个主题对应多个观察者
    		ConcreteSubject csbj = new ConcreteSubject();
    		ConcreteObserver cobs1 = new ConcreteObserver();
    		csbj.registerObserver(cobs1);
    		ConcreteObserver cobs2 = new ConcreteObserver();
    		csbj.registerObserver(cobs2);
    		ConcreteObserver cobs3 = new ConcreteObserver();
    		csbj.registerObserver(cobs3);
    		//当主题的状态改变时,会通知每个观察者,每个观察者会做出相应的状态改变。
    		csbj.setState(20);
    		System.out.println("------------------");
    		csbj.setState(400);
    		
    	}
    
    }
    

     运行结果:

    myState changed:20
    myState changed:20
    myState changed:20
    ------------------
    myState changed:400
    myState changed:400
    myState changed:400

  • 相关阅读:
    java中创建线程的方式
    idea查看一个接口的子接口或实现类的快捷键
    idea查看源码没有注释的问题
    spring中的Aop
    spring中的ApplicationListener监听器
    spring中的事务管理
    IDEA创建springboot 项目
    xiaopiu产品设计
    java 6大设计原则 一:观察者模式
    java面向对象
  • 原文地址:https://www.cnblogs.com/wxisme/p/4499147.html
Copyright © 2011-2022 走看看