zoukankan      html  css  js  c++  java
  • 设计模式之观察者(Observer)模式 代码详解

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * User: HYY
     * Date: 13-10-28
     * Time: 下午1:34
     * To change this template use File | Settings | File Templates.
     */
    
    /**
     * 这里使用接口是因为各个观察者可能有各自的独特的方法和属性,因此将其抽象成方法
     */
    interface Observer {
        void update();
    }
    
    interface Subject {
        void addObserver(Observer observer);
    
        void deleteObserver(Observer observer);
    
        void notifyObservers();
    }
    
    class ConcreteObserver implements Observer {
        private String ObserverName;
        private Subject subject;//一个指向主题的引用,
    
        public ConcreteObserver(String ObserverName, Subject subject) {
            this.ObserverName = ObserverName;
            this.subject = subject;
            if (this.subject != null) {
                this.subject.addObserver(this);
            }
        }
    
        @Override
        public void update() {
            //在这个方法中可以通过它,来判断自己关注的数据是否发生变化,并作出相应的行动
            System.out.println(ObserverName + " 已经被更新!");
        }
    }
    
    class ConcreteSubject implements Subject {
        List<Observer> observerList;
    
        public ConcreteSubject() {
            this.observerList = new ArrayList<Observer>();
        }
    
        @Override
        public void addObserver(Observer observer) {
            if (observer != null) {
                if (observerList.contains(observer)) {
                    System.out.println("已有该观察者,无需添加!");
                } else {
                    observerList.add(observer);
                }
            }
        }
    
        @Override
        public void deleteObserver(Observer observer) {
            observerList.remove(observer);
        }
    
        @Override
        public void notifyObservers() {
            for (Observer observer : observerList) {
                observer.update();
            }
        }
    }
    
    public class MyObserverTest {
        public static void main(String[] args) {
            //初始化4个观察者和一个被观察对象,构造函数自动将观察的对象附上关系
            ConcreteSubject subject = new ConcreteSubject();
    
            ConcreteObserver observer1 = new ConcreteObserver("观察者(1)", subject);
            ConcreteObserver observer2 = new ConcreteObserver("观察者(2)", subject);
            ConcreteObserver observer3 = new ConcreteObserver("观察者(3)", subject);
            ConcreteObserver observer4 = new ConcreteObserver("观察者(4)", subject);
    
            subject.notifyObservers();
        }
    }
  • 相关阅读:
    Application Loader上传app程序
    Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法
    c#上iOS apns p12文件制作记录 iOS推送证书制件
    iOS开发~CocoaPods使用详细说明
    ios实现屏幕旋转的方法
    View页面内容的旋转,在某些情况下可替代屏幕旋转使用
    集成乐视点播功能的注意事项
    NSMutableAttributedString 富文本删除线的用法
    Objective-c的@property 详解
    ASIHttpRequest addRequestHeader的处理
  • 原文地址:https://www.cnblogs.com/wuyou/p/3425145.html
Copyright © 2011-2022 走看看