zoukankan      html  css  js  c++  java
  • 文章4片 观察者模式

    1.什么是观察者模式:

    先把观察者模式文绉绉的定义搬上来,观察者模式:定义了对象之间的一对多的以来,当一个对象状态改变 时,他的全部依赖者都会收到通知而且自己主动更新.

    事实上定义说的也并非那么文绉绉,以下我们来举一个样例:对于一个班来说,有若干个学生,一个班主任.仅仅要有通知的时候,班主任会给每一个学生发送飞信来通知大家.当有 一个孩子想增加这个班的时候他仅仅需告诉班主任来注冊就能够增加这个班.当他增加这个班以后呢,这个班有什么通知的话他也会收到班主任发的飞信.当有某个同学不想呆在这里转班了,他会通知班主任把自己移除,以后班级里的通知他便收不到了.班主任与学生的关系例如以下图所看到的:


                                                 


    事实上,这就是观察者模式,学生相当于观察者,仅仅要老师这边一有什么通知(发生改变),然后作为观察者的学生便会知悉,并作出处理.因此:主题+观察者=观察者模式.

    2.观察者模式的实现方法:

    我们要实现观察者能通过主题的接口注冊和移除,主题能通过观察者的接口接收通知.他们之间的关系为:

     

    首先,定义主题的接口:

    package com.john;
    
    public interface Subject {
    	public void addObserver(Observer o);
    	public void removeObserver(Observer o);
    	public void notifyObservers();
    }
    然后,定义我们的观察者接口:

    package com.john;
    
    public interface Observer {
    	public void update(String message);
    }
    
    然后接下来就是定义我们的老师类:

    package com.john;
    
    import java.util.ArrayList;
    
    public class Teacher implements Subject {
    	private ArrayList<Observer> observers;
    	private String message;
    	
    	public Teacher(){
    		observers = new ArrayList<Observer>();
    	}
    
    	public void addObserver(Observer o) {
    		observers.add(o);
    	}
    
    	public void removeObserver(Observer o) {
    		int i = observers.indexOf(o);
    		if(i > 0){
    			observers.remove(i);
    		}
    		
    	}
    	public void notifyObservers() {
    		for (Observer o : observers) {
    			o.update(message);
    		}
    	}
    	public void ReceiveMessage(String message){
    		this.message = message;
    		notifyObservers();//接受到新的通知,通知全部学生
    	}
    
    }
    
    然后定义我们的学生类:

    package com.john;
    
    public class Student implements Observer {
    	private String name;
    	private String message;
    	
    	public Student(String name,Teacher t){
    		this.name = name;
    		t.addObserver(this);
    	}
    	public void update(String message) {
    		this.message = message;
    		processmessage();
    	}
    
    	public void processmessage(){
    		System.out.println("学生"+name+"收到通知."+message);
    	}
    }
    最后,来一个主函数查看我们的学生能否实时收到老师发送的消息呢?

    package com.john;
    
    public class Main {
    	
    	public static void main(String args[]){
    		Teacher teacher = new Teacher();
    		
    		Student xiaoming = new Student("小明",teacher);
    		Student xiaohua = new Student("小华",teacher);
    		Student xiaohong = new Student("小红",teacher);
    		
    		teacher.ReceiveMessage("今天的作业是抄一遍课文");
    		teacher.ReceiveMessage("明天不用来上学了");
    	}
    }
    看一看我们的执行结果:

                  

      通过我们的执行结果,我们可以看到,仅仅要老是发送消息,我们的学生就行实时的收到.

    3.总结

    观察者模式中,当主题有新的变化的时间,观众可以始终接收信息本身并接受加以解决.

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Spring中的资源加载
    分布式系统Paxos算法
    MySQL中MyISAM与InnoDB区别及选择(转)
    Unable to construct api.Node object for kubelet: can't get ip address of node master.example.com: lookup master.example.com on : no such host
    分库情况下的数据库连接注入
    Core源码(二) Linq的Distinct扩展
    B-Tree详解
    C#进阶之路(八)集合的应用
    重温CLR(十八) 运行时序列化
    重温CLR(十七)程序集加载和反射
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4685199.html
Copyright © 2011-2022 走看看