zoukankan      html  css  js  c++  java
  • 设计模式

    观察者模式的Java实现

    The Observer Pattern defines a one-to-many
    dependency between objects so that when one
    object changes state, all of its dependents are
    notified and updated automatically.

    Java 的实现方式:

    第一个类继承自java.util.Observable,这个类是被观察者要实现的类。实际应用中如天气预报的数据源类、监控中的数据汇总类等。这个基类有几个方法接口:

    public synchronized void addObserver(Observer o)
    public synchronized void deleteObserver(Observer o)
    public void notifyObservers()
    public void notifyObservers(Object arg)
    public synchronized void deleteObservers()


    protected synchronized void setChanged()

    第二个类是观察者类java.util.Observer。 他只有一个方法: update

    这里有几个很重要的概念需要记住:Observable类所处的角色应该是一个看板一样,想要被更新的对象要在他这里被注册(注意在整个程序中应该保持这个Observable对象的惟一性,而且有哪些观察者来订阅它完全是由主程序决定的。)Observable和Observer所共同关心的数据源应该是被独立出来的也就是update, notify中提到的arg对象

    package com.ctrip.pattern.Observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     * Created by ygshen on 2015/8/6.
     */
    public class WeatherDataSubject extends Observable {
    
        public WeatherDataSubject(){
    
        }
        public void Trigger(Object arg){
            setChanged();
            notifyObservers(arg);
        }
        @Override
        protected synchronized void setChanged() {
            super.setChanged();
        }
    
        @Override
        public void notifyObservers() {
    
            super.notifyObservers();
        }
    
        @Override
        public synchronized void addObserver(Observer o) {
            super.addObserver(o);
        }
    
        @Override
        public synchronized void deleteObserver(Observer o) {
            super.deleteObserver(o);
        }
    
        @Override
        public void notifyObservers(Object arg) {
            super.notifyObservers(arg);
        }
    
        @Override
        public synchronized void deleteObservers() {
            super.deleteObservers();
        }
    }
    Subject
    package com.ctrip.pattern.Observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    /**
     * Created by ygshen on 2015/8/6.
     */
    public class WeatherDataObserver implements Observer {
        private Observable _observable;
    
        public WeatherDataObserver(Observable subject)
        {
         _observable=subject;
            subject.addObserver(this);
        }
        @Override
        public void update(Observable o, Object arg) {
    
            if(o instanceof WeatherDataSubject){
                WeatherData data = (WeatherData)arg;
    
                System.out.print("Temprature"+data.get_temp()+"; humidity:"+data.get_humidity());
            }
        }
    }
    Observer
    package com.ctrip.pattern.Observer;
    
    /**
     * Created by ygshen on 2015/8/6.
     */
    public class WeatherData {
        private int _temp;
        private int _humidity;
    
        public int get_temp() {
            return _temp;
        }
    
        public void set_temp(int _temp) {
            this._temp = _temp;
        }
    
        public int get_humidity() {
            return _humidity;
        }
    
        public void set_humidity(int _humidity) {
            this._humidity = _humidity;
        }
    }
    观察者和被观察者都关注的Data

    主程序主要负责:Observerable对象的一致性、哪些观察者要注册到被观察者中、被观察者何时触发观察者事件

    import com.ctrip.pattern.Observer.WeatherData;
    import com.ctrip.pattern.Observer.WeatherDataObserver;
    import com.ctrip.pattern.Observer.WeatherDataSubject;
    
    /**
     * Created by ygshen on 2015/8/6.
     */
    public class MainClass {
        public static void main(String[] args){
    
            WeatherDataSubject sub=new WeatherDataSubject();
            WeatherDataObserver bserver=new WeatherDataObserver(sub);
            GetSubjectorAndObservers(sub,bserver);
    
            WeatherData data = new WeatherData();
            data.set_humidity(123);
            data.set_temp(321);
            sub.Trigger(data);
        }
    
    
        private static void GetSubjectorAndObservers(WeatherDataSubject sub,WeatherDataObserver observer){
             sub = new WeatherDataSubject();
    
            observer = new WeatherDataObserver(sub);
        }
    }
    应用程序

    观察者模式的NET实现。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test.Library
    {
       public class Subjector: IObservable<ObservableItem>
        {
    
           private List<IObserver<ObservableItem>> _observers=new List<IObserver<ObservableItem>>();
    
            public IDisposable Subscribe(IObserver<ObservableItem> observer)
            {
                if (!_observers.Contains(observer))
                {
                    _observers.Add(observer);
                }
    
                return new Unsubscriber(_observers, observer);
            }
    
            public void Trigger(ObservableItem item) {
                foreach (var i in _observers) {
                    i.OnNext(item);
                }
            }
        }
    
       public class Unsubscriber: IDisposable {
    
           private List<IObserver<ObservableItem>> _observers;
           private IObserver<ObservableItem> _observer;
           public Unsubscriber(List<IObserver<ObservableItem>> observers, IObserver<ObservableItem> observer) {
               _observers = observers;
               _observer = observer;
           }
           public void Dispose()
           {
               throw new NotImplementedException();
           }
       }
    
        public class ObservableItem{
    
        }
    }
    Subject

    Observer:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test.Library
    {
        public class Observer : IObserver<ObservableItem>
        {
            public void OnCompleted()
            {
                throw new NotImplementedException();
            }
    
            public void OnError(Exception error)
            {
                throw new NotImplementedException();
            }
    
            public void OnNext(ObservableItem value)
            {
                Console.WriteLine("Observer is triggered");
            }
        }
    }
    Observer
      public class Monitor
        {
            private void GetSubjectorAndObservers(out Subjector s, out Observer o) {
                s = new Subjector();
                o = new Observer();
                s.Subscribe(o);
            }
            public void DoMonitor(Action<Subjector> action) {
                Subjector s;
                Observer o;
    
                GetSubjectorAndObservers(out s, out o);
                s.Trigger(new ObservableItem());
                action(s);
            }
        }
    
    
     static void Main(string[] args)
            {
                Monitor mon = new Monitor();
                mon.DoMonitor((observer) =>
                {
                    Console.WriteLine("Hello world");
                });
            }
    主程序
    
    
    
  • 相关阅读:
    每天一个linux命令(22):find 命令的参数详解
    在gitlab中创建项目后如何用git初始上传项目
    TensorBoard可视化
    docker CMD 和 ENTRYPOINT 区别
    django 项目开发及部署遇到的坑
    nginx + uwsgi 部署django项目
    centos7 追加python3 + 使用pip + virtualenv
    docker 常用命令
    Django+celery+rabbitmq实现邮件发送
    web框架链接
  • 原文地址:https://www.cnblogs.com/ygshen/p/4707144.html
Copyright © 2011-2022 走看看