`

设计模式(一)Observer(观察者)模式

阅读更多

Observer模式属于行为模式,是为了定义对象间的一种一对多的关系。当一个对象的状态发生改变时,所有依赖它的对象都将得到通知,并自动更新。模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。

【实例】老师有电话号码,学生需要知道老师的电话号码以便在需要的时候拨打,在这样的模式中,老师就是一个被观察者(Subject),学生就是需要知道信息的观察者。当老师的电话号码发生改变时,学生会得到通知,并更新相应的电话记录。

如图所示:


 用Java代码实现:

 

public interface IObServer {
    public void update(String msg);
}

 

public class Student implements IObServer {

    private String student_name;
    public Student(String name){
      student_name = name;
    }
	
    @Override
    public void update(String msg) {
      // TODO Auto-generated method stub
      System.out.println(student_name + ":\t" + msg);
    }
}

 

public interface ISubject {
    //添加一个通知
    public void add(IObServer o);
    //移除一个通知
    public void del(IObServer o);
    //执行下达通知的指令
    public void notice();
}

 

import java.util.ArrayList;

public class Teacher implements ISubject {
    //定义students:所有学生
    private ArrayList<IObServer> students = new ArrayList<IObServer>();
    private String msg = "";//老师要发出的信息
    public void setMsg(String new_msg){
      msg = new_msg;
    }
	
    @Override
    public void add(IObServer o) {
      students.add(o);
    }

    @Override
    public void del(IObServer o) {
      students.remove(o);
    }

    @Override
    public void notice() {
      for(int i=0;i<students.size();i++){
        students.get(i).update(msg);
      }
    }
}

 

public class Test {

    public static void main(String[] args) {
      ArrayList<IObServer> students = new ArrayList<IObServer>();
      Teacher t = new Teacher();
      for(int i=1;i<=10;i++){
        Student s = new Student("aa"+i);
        students.add(s);
        t.add(s);
      }
      t.setMsg("phone:123456789");
      t.notice();
      System.out.println("-----把其中几个学生移除接收通知的范围-----------");
      for(int i=0;i<students.size();i++){
        if(i%2==0){
          t.del(students.get(i));
        }			
      }
      t.notice();
    }
}

  
 

 

 

  • 大小: 16.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics