设计模式之观察者模式(Observer模式)


一. 观察者模式简介

1. 定义

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

2. 意义

此设计模式最重要的作用就是 解耦!将观察者与被观察者解耦,使得他们之间的依赖性更小。

3.UML图

  • Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。
  • Observer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。
  • ConcreteObserver:具体的观察者。

二. 观察者模式实现

以上理论相信大家并不模式,现在我们来应用到实际中。

1. 被观察者Subject对象

首先是一个Subject类的父类,它实现了维护装有观察者引用集合的功能。

public class Subject {
    //保存注册的观察者对象
    private List<Observer> mObervers = new ArrayList<>();

    //注册观察者对象
    public void attach(Observer observer) {
        mObervers.add(observer);
        Log.e("SZH", "attach an observer");
    }

    //注销观察者对象
    public void detach(Observer observer) {
        mObervers.remove(observer);
        Log.e("SZH", "detach an observer");
    }

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

接着是一个具体的被观察者对象

public class ConcreteSubject extends Subject {
    private String state;

    public String getState() {
        return state;
    }

    public void change(String newState) {
        state = newState;
        Log.e("SZH", "concreteSubject state:" + newState);

        //状态发生改变,通知观察者
        notifyEveryOne(newState);
    }
}

2. 观察者Observer对象

首先是一个接口,抽象出了一个及时更新的方法

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

接着是几个观察者对象。

public class ObserverA implements Observer {

    //观察者状态
    private String observerState;

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是A模块,快来抢吧!!");
    }
}

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

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是B模块,快来抢吧!!");
    }
}

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

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是C模块,快来抢吧!!");
    }
}

最后是调用方法:

public class ObserverActivity extends Activity {
    private ConcreteSubject mConcreteSubject;
    private ObserverA mObserverA;
    private ObserverB mObserverB;
    private ObserverC mObserverC;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mConcreteSubject = new ConcreteSubject();
        mObserverA = new ObserverA();
        mObserverB = new ObserverB();
        mObserverC = new ObserverC();

        mConcreteSubject.attach(mObserverA);
        mConcreteSubject.attach(mObserverB);
        mConcreteSubject.attach(mObserverC);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mConcreteSubject.change("倒计时结束,开始秒杀");
            }
        }, 3000);
    }
}

为了让大家更好的理解,以上uml图可以通过下面这个图更好地记忆。

三. 最后

以上设计模式的代码都已经集成到demo中,欢迎下载查看。
该demo会陆续集成各种设计模式,欢迎关注。

参考

https://blog.csdn.net/weixin_39494923/article/details/94553662

https://blog.csdn.net/ma598214297/article/details/80557821


 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值