zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者模式

    标签(空格分隔): 设计模式


    观察者模式: 当对象之间存在一对多的关系的时候, 则使用观察者模式. 比如当一个对象呗修改的时候, 则会自动通知他的依赖对象, 观察者模式属于行为模式

    优点

    观察者模式实现了动态联动
    观察者模式实现了广播通信

    缺点

    如一个主题被大量观察者观察, 则通知所有的观察者的代价较高.
    如果某些观察者的相应方法被阻塞, 整个通知过程也会被阻塞, 其他观察者不能及时被通知.

    public interface Observer {
        void update(String info);
    }
    
    public class StudentObserver implements Observer {
        private String name;
    
        public StudentObserver(String name) {
            this.name = name;
        }
    
        @Override
        public void update(String info) {
            System.out.println(name+"收到消息"+info);
        }
    }
    
    import java.util.ArrayList;
    import java.util.List;
    
    public interface Subject{
        void registerObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyObservers(String msg);
    }
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class TeacherSubject implements Subject{
        //用来存放和记录观察者
        private List<Observer> observers=new ArrayList<Observer>();
        @Override
        public void registerObserver(Observer obj) {  //增加观察者
            observers.add(obj);
        }
        @Override
        public void removeObserver(Observer obj) {  //删除观察者
            int i = observers.indexOf(obj);
            if( i >= 0 )
                observers.remove(obj);
        }
        @Override
        public void notifyObservers(String msg) {   //通知消息
            for(Observer observer : observers) {
                observer.update(msg);
            }
        }
    }
    
    public class Test {
        public static void main(String[] args){
            TeacherSubject teacher = new TeacherSubject();
            StudentObserver studentObserver1 = new StudentObserver("鸣人");
            StudentObserver studentObserver2 = new StudentObserver("佐助");
            teacher.registerObserver(studentObserver1);
            teacher.registerObserver(studentObserver2);
            teacher.notifyObservers("发作业啦");
        }
    }
    
  • 相关阅读:
    HDU3910(数学期望题,题目难懂)
    HDU2389(二分图匹配Hopcroft-Carp算法)
    二分图详解
    巴什博弈、威佐夫博弈、尼姆博弈
    HDU2819(二分图匹配,记录过程)
    查找外键未创建索引
    acl使用示例
    oracle数据库备份任务
    集中备份相关
    集中备份项目实施方案
  • 原文地址:https://www.cnblogs.com/A-FM/p/11644263.html
Copyright © 2011-2022 走看看