`
songzhan
  • 浏览: 240559 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

4月17号 -- 观察者模式

阅读更多

今天的任务:学习"观察者模式"

一、观察者模式:Observer模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时, 所有依赖于它的对象(观察者)都得到通知并被自动更新。

     在目标对象中会有观察者集合,当目标对象有变化时将会通知所有观察者集合对象做相关更新操作。

二、实例 :

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

 

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

 

    public class Student implements IObServer {  
        
        private String student_name;  
        public Student(String name){  
          student_name = name;  
        }  
          
        public void update(String msg) {  
          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;  
        }  
        //收集所有学生信息   
        public void add(IObServer o) {  
          students.add(o);  
        }  
       
        public void del(IObServer o) {  
          students.remove(o);  
        }  
       //通知学生 
        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();  
        }  
    }  

 三、模式优缺点

     观察者模式的优点:

        1、观察者模式可以实现表现层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表现层作为具体观察者角色。

        2、观察者模式在观察目标和观察者之间建立一个抽象的耦合。

        3、观察者模式符合“开闭原则”的要求。

     观察者模式的缺点:

        1、如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

        2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发他们之间进行循环调用,可能导致系统崩溃。

        3、观察者模式没有相应的机制让观察者知道所有观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化

  

四、观察者模式适用环境

 

   在以下情况下可以适用观察者模式:

        1、一个抽象的模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立的改变和复用。

        2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。

        3、一个对象必须通知其他对象,而并不知道这些对象是谁

        4、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象...,可以适用观察者模式创建一种链式触发机制 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics