观察者模式笔记

2018-01-17  本文已影响0人  VerseWang

  最近在听蔡康永的201堂情商课(原谅我没有冲喜点(#.#)),由于很少听别人谈论情商,听了马东对这个课程的介绍,又试听了n*90秒(每堂课可以试听90秒),特别想听这门课程,但看这喜点,要将近200喜点,突然之间,一万头草泥马从身边呼啸而过,所以投了下机,取了下巧,至于具体细节我就不说了,你懂的( σ_σ),做饭的时候我就拿着手机听,正好打发下做饭的无聊,可谓是一举两得,说一下听后感。我们这个国家受教育的程度越来越高,自身的素质也越来越高,而评价一个人的素质的标准有,通情达理,体谅他人,高尚,见义勇为,有爱心,学识渊博等等,总之就是一些褒义词,我认为素质包括两部分,一,智商,二,情商,智商在我们上学的时候就要用到,人越大,越需要情商,因为我们都需要有一个成功的事业,美满的家庭。这门课程抓住了现代人的G点。说得简单通俗一点,这个课程就是教你怎么做一个好人,但听了大概二十多堂课,有点失望,蔡康永主要是经验之谈,闲话先扯到这里,开始今天的正经事儿

  这一篇是有关Rxjava的第一篇(庆祝一下,好歹也是第一次(#.#)),Rxjava是基于观察者模式建立起来的,那问题来了,什么是观察者模式呢,我很模糊,几乎没用过,用笔记把他记下来

1.观察者模式介绍

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作

先上一张图,大致的流程图

UML类图

2.撸起柚子就是干

先将公共的方法提取出来,面向接口编程

大致流程

当Subject的具体实现类注册监听事件后(registerObserver())得到观察者对象,当被监听的方法(addAge())改变时,通过注册的观察者对象,面向接口编程,通知观察者改变(notifyObservers())

2.1观察者(Observer)

观察者接口

public interface Observer<T> {
T update(T t);
}

2.2被观察者(Subject)

被观察者接口

public interface Subject {
//注册监听
void registerObserver(Observer observer);
//移除所有观察者
void removeAllObserver();
//移除指定观察者
void removeOneObserver(Observer observer);
//通知给观察者
void notifyObservers();
}

接下来针对特定的场景,写实现类

2.3观察者实现类

public class ConcreteObserver<T> implements Observer<T> {

@Override
public T update(T t) {
    System.out.print("   "+t);
    return t;
    }
}

2.4被观察者实现类

@Override
public void registerObserver(Observer observer) {
    if (mRegisterList == null) {
        mRegisterList = new ArrayList<Observer>();
    } else {
        System.out.print("yi jing zhu ce le ");
    }
    mRegisterList.add(observer);
}

@Override
public void removeAllObserver() {
    if (mRegisterList != null) {
        mRegisterList.clear();
        mRegisterList = null;
    }
}

@Override
public void removeOneObserver(Observer observer) {
    if (mRegisterList != null) {
        for (Observer item : mRegisterList) {
            if (observer instanceof ConcreteObserver) {
                mRegisterList.remove(item);
                return;
            }
        }
    }
}

@Override
public void notifyObservers() {
    if (mRegisterList != null) {
        for (Observer observer : mRegisterList) {
            observer.update(mAge);
        }
    }
}

//功能扩展
public void addAge(int age) {
    mAge = age;
    notifyObservers();
}

3.总结

很好理解吧,核心思想是面对接口的编程,符合开闭原则,用到了泛型,发现超级好用,希望在工作中多将设计模式用到代码中。

上一篇 下一篇

猜你喜欢

热点阅读