10 Android常见设计模式:观察者模式

2021-12-16  本文已影响0人  彩虹_直至黑白

前言

观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需求修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了。

定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

简单实现

我们以上课铃声响起,学生老师上课为例进行说明。

  1. 创建抽象被观察者
public interface Observable {

    //添加观察者
    void addObserver(Observer observer);

    //移除观察者
    void removeObserver(Observer observer);

    //通知观察者
    void notifyObserver(String msg);
}
  1. 创建抽象观察者
public interface Observer {
    void action(String msg);
}
  1. 创建一个具体主题,即具体被观察者(上课铃声)
public class AlarmClock implements Observable {

    //保存观察者对象
    List<Observer> list = new ArrayList<>();

  @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }
    
    @Override
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }
    
    //通知观察者
    @Override
    public void notifyObserver(String msg) {
        Log.d("AlarmClock", "notifyObserver: " + list.toString());
        for (Observer observer : list) {
            observer.action(msg);
        }
    }
}
  1. 创建具体观察者(学生,老师)
public class Students implements Observer {

    private final String name;

    public Students(String name) {
        this.name = name;
    }

    @Override
    public void action(String msg) {
        Log.e("action", msg + name + ",开始听课");
    }
}
public class Teacher implements Observer {
    
    @Override
    public void action(String msg) {
        Log.e("action", msg + ",老师开始讲课");
    }
}
  1. 调用展示结果
//创建被观察者 
Observable alarmClock = new AlarmClock();

//创建观察者
 Observer student1 = new Students("小屁孩");
 Observer student2 = new Students("中屁孩");
 Observer student3 = new Students("大屁孩");
 Observer teacher = new Teacher();

//注册观察者
 alarmClock.addObserver(teacher);
 alarmClock.addObserver(student1);
 alarmClock.addObserver(student2);
 alarmClock.addObserver(student3);

//通知已注册的观察者
 alarmClock.notifyObserver("上课铃声已经响了");

总结

观察者模式主要的作用就是对象解耦,将观察者与被观察者完全隔离,只依赖于Observer和Observable抽象。例如,ListView就是运用了Adapter和观察者模式使得它的可扩展性、灵活性非常强,而耦合度却很低,这是设计模式在Android源码中优秀运用的典范。

上一篇下一篇

猜你喜欢

热点阅读