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

         定义:定义了对象之间的一对多依赖,当一个对象改变状态时。它的全部依赖者都会收到通知并自己主动更新。

        类图:

         

            利用观察者模式,主题是具有状态的对象,而且能够控制这些状态。有很多观察者依赖主题来告诉他们状态何时改变了。

    这就产生一个关系:“一个“主题对”多个“观察者的关系。

            当两个对象之间松耦合,他们依旧能够交互,可是不太清楚彼此的细节。

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

    代码

       主题接口

    public interface Subject {
        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObserver();
    }
    

    详细主题类

    import java.util.ArrayList;
    
    
    public class ConcreteSubject implements Subject{
    	private ArrayList observers = new ArrayList();
    	private String name;
    	@Override
    	public void notifyObserver() {
    		for (int i = 0; i < observers.size(); i++) {
    			Observer observer = (Observer)observers.get(i);
    			observer.update();
    		}
    	}
    
    	@Override
    	public void registerObserver(Observer o) {
    		 observers.add(o);
    	}
    
    	@Override
    	public void removeObserver(Observer o) {
    		int i = observers.indexOf(o);
    		if (i >= 0) {
    			observers.remove(i);
    		} 
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    		notifyObserver();
    	}
    
    }

    观察者接口

    public interface Observer {
       public void update();
    }
    
    详细观察者1

    public class ConcreteObserver implements Observer{
    
    	private ConcreteSubject consubject;
    	@Override
    	public void update() {
    		 
    		 System.out.println(consubject.getName());
    	}
    	public ConcreteObserver(ConcreteSubject consubject) {
    		 
    		this.consubject = consubject;
    	}
      
    }
    

    详细观察者2

    public class ConcreteObserver2 implements Observer{
      
    	private ConcreteSubject consubject;
    	@Override
    	public void update() {
    		 
    		 System.out.println(consubject.getName());
    	}
    	public ConcreteObserver2(ConcreteSubject consubject) {
    		 
    		this.consubject = consubject;
    	}
    	
    }
    

    client

    public class ClientTest {
     
    	public static void main(String[] args) {
    		 
    		ConcreteSubject sub = new ConcreteSubject();
    		sub.registerObserver(new ConcreteObserver(sub));
    		sub.registerObserver(new ConcreteObserver2(sub));
    		sub.setName("Allen");
    	}
    
    }


    执行结果

    Allen

    Allen

        通过执行结果能够看到。我们仅仅调用了Subject的方法,但同一时候两个观察者的相关方法都被同一时候调用了。细致看一下代码,事实上非常easy,无非就是在Subject类中关联一下Observer类。而且在notifyObserver方法中遍历一下Observer的update方法即可了。

      






  • 相关阅读:
    Python TIPS上一道关于人民币金额小写转大写的题
    C Primer Plus--C预处理器和C库(1)
    C Primer Plus--位操作
    C Primer Plus--结构和其他数据类型(2)
    计算机缓存方式对于程序运行的影响
    7. 整数反转
    服务器初始化安装docker、docker-compose
    nacos爬坑史-1
    Kafka 报错: Error Uncaught exception in scheduled task 'flush-log'
    CentOS中docker部署的项目CPU占用率持续100%以上
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6817579.html
Copyright © 2011-2022 走看看