设计模式-观察者模式-Observer

观察者模式,也叫发布/订阅模式,在对象之间定义1对多的单向依赖关系,使目标对象发生改变时,观察者对象可以即时收到消息并作出处理。

一、4个元素

1、目标对象接口
2、目标对象
3、观察者接口
4、观察者对象

二、核心原理

观察者模式利用单向依赖的方式完全解耦对象关系,目标对象发生改变时无需关心观察者对象实例。符合依赖倒转原则 和 接口隔离原则。

三、示例代码

1、目标对象接口
/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 被观察者接口,用于注册/反注册/通知。
 */
public interface ISubject {

    void registerObserver(IObserver observer);

    void unRegisterObserver(IObserver observer);

    void notifyDataByChanged(Object obj);
}
2、观察者接口
/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 观察者接口
 */
public interface IObserver {

    void update(Object obj);
}
3、目标对象
/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 被观察者实体 = 例如推送工具
 */
public class PushSubject implements ISubject {

    private List<IObserver> observers;

    @Override
    public void registerObserver(IObserver observer) {
        if (observers == null) {
            observers = new ArrayList<>();
        }
        observers.add(observer);
    }

    @Override
    public void unRegisterObserver(IObserver observer) {
        if (observers != null) {
            observers.remove(observer);
        }
    }

    @Override
    public void notifyDataByChanged(Object obj) {
        if (observers == null) {
            return;
        }
        for (IObserver i : observers) {
            i.update(obj);
        }
    }

    public void ReceiveMsg(String message) {
        // 接收到推送消息,需要通知其他地方处理消息
        this.notifyDataByChanged(message);
    }
}
4、观察者对象
/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 观察者/订阅者:android手机端
 */
public class AndroidOb implements IObserver {

    @Override
    public void update(Object obj) {
        Log.d("common", "Android手机收到通知了:" + obj.toString());
    }
}

/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 观察者/订阅者/iOS端
 */
public class IosOb implements IObserver {

    @Override
    public void update(Object obj) {
        Log.d("common", "Ios手机收到通知了:" + obj.toString());
    }
}
5、使用
/**
 * 作者: Created by AdminFun
 * 邮箱: [email protected]
 * 创建: 2019/1/8
 * 修改: 2019/1/8
 * 版本: v1.0.0
 * 描述: 观察者模式,也叫发布/订阅模式
 * 定义:在对象之间定义1对多的单向依赖关系,使目标对象发生改变时,观察者对象可以收到消息。
 * 角色:目标对象接口、目标对象、观察者接口、观察者对象
 * 目的:利用单向依赖方式完全解耦对象关系,目标对象发生改变时无需关心观察者对象实例。
 * 符合依赖倒转原则 和 接口隔离原则
 */
public class ObserverTest {

    public static void main() {
        PushSubject observered = new PushSubject();
        observered.registerObserver(new AndroidOb());
        observered.registerObserver(new IosOb());
        observered.registerObserver(new IObserver() {

            @Override
            public void update(Object obj) {
                Log.d("common", "测试类也收到了消息:" + obj.toString());
            }
        });

        // 测试收到推送消息
        observered.ReceiveMsg("还有1个月要过年了。");
    }
}
打印结果

// Android手机收到通知了:还有1个月要过年了。
// Ios手机收到通知了:还有1个月要过年了。
// 测试类也收到了消息:还有1个月要过年了。

猜你喜欢

转载自blog.csdn.net/weixin_34072458/article/details/87394431