Java1.8新特性中的观察者模式

Java1.8新特性里类封装的观测者模式,可以简化过去定义观察者设计模式(订阅发布模式)代码的步骤


Java1.8新特性中的观察者模式_第1张图片

某一个事物状态发生改变,从而产生一系列的连锁反应,那么这个事务就是被观察者;

Java1.8新特性中的观察者模式_第2张图片

原理:当被观察者发送变化的时候,是由被观察者主动通知观察者,我发送了变化,你要根据这个变化去做对应的逻辑处理
 * 采用这种设计模式的典型:EventBus,RxAndroid
 * 提示:喜欢称观察者设计模式为订阅发布模式,因为可以理解为,发布者发布了新的产品,主动的告诉关注发布的订阅者,我有新东西出来了
 * 补充一点:观察者设计模式,容易让人误解他的内部结构,但是大家都这么说,所以成惯例,实际上也可以用订阅发布模式去称,我觉得更合理

例子:Android的点击事件就是典型观察者模式
Java1.8新特性里面提供了两个类,观察者与被观察
Java1.8新特性:1.java的JDK必须是1.8及以上版本          2.必须在studio搭建环境才可以使用(搭建环境参考笔记:Java8 环境的搭建)

以点击事件去演示观察者设计模式:
        //最典型的观察者设计模式
        //被观察者(发布者)
        button = (Button) findViewById(R.id.button);

        //观察者(订阅者)
        View.OnClickListener onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                account.setMoney(1000);
            }
        };
        //发布和订阅关联
        //观察对象与被观察对象进行关联
        button.setOnClickListener(onClickListener);

实现的基本思路
     * 1.创建一个被观察类
 function:B.代表着被观察者,银行账户      钱发送变化通知用户信息
 1.被观察者类继承Observable类
 2.观察数据
 3.改变观察数据的方法
 4.必须要写的两个方法setChanged(); notifyObservers();

public class Account extends Observable {
    public int money  = 0;

    public void setMoney(int money){
        this.money =money;

        //observable特有的方法,被观察者必须要写的两个方法
        setChanged();
        notifyObservers();
    }
}

     * 2.创建一个观察类
 function:观察者    用户,当银行账户的钱发送变化时,就会收到用消息
 1.被观察者类实现Observer类
 2.覆写update方法
 3.对observable参数,要进行判断和强类型转换,因为项目中的被观察者可能很多
 4.强转被观察者对象,对其观察数据进行一系列的业务逻辑操作

public class Person implements Observer{

    //注意:参数 1就是继承Observable的被观察者
    @Override
    public void update(Observable observable, Object o) {
        //我们使用observable参数,要进行判断和强类型转换,因为项目中的被观察者可能很多.
        if( observable instanceof Account){
            //强转被观察者对象
            Account account = (Account) observable;
            System.out.println("银行Account钱的变化 : "+account.money);
        }
    }
}

     * 3.使二者关联
        //创建被观察者对象
        account = new Account();
        //创建观察者对象
        Person person = new Person();
        //把观察者注册到被观察者身上
        account.addObserver(person);
        //改变被观察者的数据
        account.setMoney(500);

    提示:当被观察观察数据发送变化时,观察者会执行update方法里的逻辑







你可能感兴趣的:(移动互联)