• 文章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.总结

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

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

  • 相关阅读:
    VCC、VDD、VEE等区别
    Matlab运行速度/效率受哪些因素影响?
    strtok/atoi/atof/atol函数用法 详解
    双色球随机生成
    万能指针void*学习
    空指针和 指向指针的指针
    指针运算
    快速编译c/cpp文件
    贪吃蛇(C)
    判断规定时间内有无输入
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4685199.html
Copyright © 2020-2023  润新知