java 观察者模式

一 观察者模式
定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖会收到通知并自动更新。
UML图:
这里写图片描述

1.1 Observer 接口
观察接口
提供了updata()方法,供Subject.notifyObservers()调用,具体实现在ObserverObject;

package observer;

/**
 * Created by zjy on 2017/3/28.
 */
public interface Observer {
    public void update(int data);

}

1.2 Subject接口

package observer;

/**
 * Created by zjy on 2017/3/28.
 */
public interface Subject {
    public void registerObserver(Observer observer);
    public void delectObserver(Observer observer);
    public void notifyObservers();

}

1.3 Data
Subject接口具体实现
ArrayList observers维护观察者列表;

package observer;

import java.util.ArrayList;

/**
 * Created by zjy on 2017/3/28.
 */
public class Data implements Subject {
    ArrayList<Observer> observers;

    int data;
    public void setData(int data) {
        this.data = data;
        dataChange();

    }
    public void dataChange() {
        notifyObservers();

    }

    public Data() {
        this.observers = new ArrayList<Observer>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);

    }

    @Override
    public void delectObserver(Observer observer) {
        int index= observers.indexOf(observer);
        observers.remove(index);

    }

    @Override
    public void notifyObservers() {
        for (Observer observer:observers){
            observer.update(data);
        }
    }

}

1.4 ObserverObject
Observer接口具体实现
Subject subject维护观察的主题;

package observer;

/**
 * Created by zjy on 2017/3/28.
 */
public class ObserverObject implements Observer {
    int data;
    Subject subject;
    @Override
    public void update(int data) {
        this.data=data;
        System.out.println(this+"**data:"+data);
    }

    public ObserverObject(Subject subject) {
        this.subject =subject;
        subject.registerObserver(this);
    }
}

1.5 测试

package observer;

/**
 * Created by zjy on 2017/3/28.
 */
public class Test {
    public static void main(String[] args){
        Data data = new Data();
        ObserverObject observerObject1 = new ObserverObject(data);
        ObserverObject observerObject2 = new ObserverObject(data);
        data.setData(1);
        data.delectObserver(observerObject2);
        data.setData(2);
        data.registerObserver(observerObject2);
        data.setData(3);


    }
}

结果:

这里写图片描述

data为1两个观察者;
注销观察者2,数据改变为2,观察者1收到;
注册观察者2,数据改变为3,观察者1、2均收到;

二 java 观察者模式

UML图:

这里写图片描述

1.主题类中obs维护观察者列表;
2.public synchronized void addObserver(Observer o) 添加实现Observe接口的类,别的方法类似第一部分
3.Java Observable 是线程安全。
4.没有面向接口编程,Observable是个类

三 Android 中观察者模式

view.OnclickListener(new OnclickListener(){
@Override
public void onClick(@NonNull View v) {
}
});

View 中定义OnclickListener接口;
DeclaredOnClickListener 实现OnclickListener接口中Onclick方法;
performAccessibilityActionInternal方法当action为ACTION_CLICK时通过performClick()方法调用Onclick;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值