设计模式十二:观察者模式(Observer Pattern)

目录

相关文章:

一、详解

1、概念

2、使用场景

3、UML结构图分析

4、实际代码分析

5、优点

二、在Android中的实际运用


相关文章:

Android的设计模式-观察者模式

一、详解

1、概念

定义对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。

  • 观察者属于行为型模式。
  • 观察者模式又被称作发布/订阅模式。
  • 观察者模式主要用来解耦,将被观察者和观察者解耦,让他们之间没有没有依赖或者依赖关系很小。

2、使用场景

  • a、一个抽象模型有两个方面,其中一个方面依赖于另一个方面
  • b、一个对象的改变将导致一个或多个其他对象也发生改变
  • c、需要在系统中创建一个触发链

3、UML结构图分析

4、实际代码分析

/**
 * 抽象目标者
 */
public abstract class Subject {
    //保存注册的观察者对象
    private List<Observer> mObservers = new ArrayList<>();

    //注册观察者对象
    public void attach(Observer observer){
        mObservers.add(observer);
        System.out.println("Attached an observer");
    }

    //注销观察者对象
    public void detach(Observer observer){
        mObservers.remove(observer);
    }

    //通知所有的观察者对象
    public void notifyObservers(String newState){
        for (Observer observer:mObservers){
            observer.update(newState);
        }
    }
}

public interface Observer {
    void update(String state);
}

public class ConcreteSubject extends Subject {
    private String state;

    public String getState() {
        return state;
    }

    public void change(String newState) {
        state = newState;
        System.out.println("ConcreteSubject State: " + state);

        //状态发生改变时,通知观察者
        notifyObservers(state);
    }
}

public class ConcreteObserver implements Observer {
    //观察者状态
    private String observerState;

    @Override
    public void update(String state) {
        //更新观察者状态,让它与目标状态一致
        observerState = state;
        System.out.println("ConcreteObserver State: " + observerState);
    }
}

public class Client {
    public static void main(String[] args) {
        //创建目标对象
        ConcreteSubject concreteSubject = new ConcreteSubject();
        //创建观察者对象
        Observer observer = new ConcreteObserver();
        //将观察者对象注册到目标对象上
        concreteSubject.attach(observer);
        //改变目标对象的状态
        concreteSubject.change("I am changed");
    }
}

5、优点

 

二、在Android中的实际运用

1、回调模式

实现了抽象类/接口的实例 实现了父类的提供的抽象方法后,将该方法交还给父类来处理。

public class Employee {
    /**
     * 定义回调接口的成员变量
     */
    private Callback mCallback;

    /**
     * 声明回调接口
     */
    public interface Callback {
        public abstract void work();
    }

    /**
     * 设置回调接口对象成员变量
     */
    public void setCallback(Callback callback) {
        this.mCallback = callback;
    }

    /**
     * 调用回调接口对象中的方法
     */
    public void doWork(){
        mCallback.work();
    }
}

public class Boss {
    private Employee employee;

    /**
     * 为Employee设置回调函数,在这里定义具体的回调方法
     */
    public void setCallback(){
        employee.setCallback(new Employee.Callback() {
            @Override
            public void work() {
                System.out.println("Boss work");
            }
        });
    }
}

2、ListView中的notifyDataChanged

3、Rxjava

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值