java设计模式 观察者模式 实例教学

  观察者设计模式适合解决多种对象跟踪一个对象数据变化的程序结构问题,有一个称作是“主题”的对象

和若干个称作“观察者”的对象。举个现实生活中的例子:网络游戏中,你可以看到别人在地图上移动,此时就将

那个人物当作广播(也就是主题),而我们自己的人物就是能“观察”到对方人的行踪。所以我们就是观察者,即接收广播的人。

  下面来一个实践练习:

比如班主任有电话号码,学生需要知道老师的号码才能在合适的时间打电话,因此老师号码发生变化,必须通知所有的学生。

我们可以利用观察者模式编制相应的功能类和测试类。相应的解释在代码行中。

1.定义主题实现类(广播站)

 1 //包路径 2 import java.util.ArrayList;
 3 import java.util.List;
 4 //目的实现类
 5 class Want
 6 {
 7     private String teacherNum;      //老师号码,下面为号码的get,set方法
 8     public String getTeacherNum()
 9     {
10         return teacherNum;
11     }
12     public void setTeacherNum(String teacherNum)
13     {
14         this.teacherNum = teacherNum;
15     }
16 
17     List<IStudent> studentDate=new ArrayList<IStudent>();//学生观察者
18     public void addObserver(IStudent iStudent)//添加观察者
19     {
20         studentDate.add(iStudent);
21     }
22     public void deleteObserver(IStudent iStudent)//删除观察者
23     {
24         studentDate.remove(iStudent);
25     }
26     public void notifyObservers()//通知观察者去响应
27     {
28         for(IStudent iObserver :studentDate)
29         {
30             iObserver.updateInfo(this.teacherNum);
31         }
32     }
33 }

**主题要知道有哪些观察者对其进行检测,因此主题类中一定有一个集合类成员变量,包含了观测者的对象集合。

**既然包含了观察者的对象集合,那么,观察者就一定要是多态的,有共同的父类接口。

**主题有固定的三个功能:a.添加观察者 b. 撤销(删除)观察者 c.向观察者发送通知。 

2.定义一个IStuden观察者 接口

1 package com.Mark.chapter12.observer.homework;
2 
3 public interface IStudent
4 {
5     public void updateInfo(String teacherNum);
6 }

3.IStudent的实现类

 1 package com.Mark.chapter12.observer.homework;
 2 
 3 public class Student implements IStudent
 4 {
 5 
 6     @Override
 7     public void updateInfo(String teacherNum)
 8     {
 9         System.out.println("学生们都听好了!老师的号码改啦,改成"+teacherNum+"了!");
10     }
11 }

4.测试类Test

package com.Mark.chapter12.observer.homework;

public class Test
{
    public static void main(String[] args)
    {
        Want w1=new Want();
//        创建学生观察者
        IStudent student1=new Student();
        IStudent student2=new Student();
        IStudent student3=new Student();
//        将学生观察者加入到“广播范围”中
        w1.addObserver(student1);
        w1.addObserver(student2);
        w1.addObserver(student3);
//        设置老师改过的号码 :911 每个学生都发一个信息
        w1.setTeacherNum("911");
//        传播广播
        w1.notifyObservers();
    }
}

运行结果:

学生们都听好了!老师的号码改啦,改成911了!
学生们都听好了!老师的号码改啦,改成911了!
学生们都听好了!老师的号码改啦,改成911了!

 

谢谢阅读,不懂的可以留言。

posted @ 2018-03-20 19:24  TinyMark  阅读(935)  评论(1编辑  收藏  举报