设计模式学习(二)-- 观察者模式 Observer Pattern

观察者模式:定义了对象之间的一对多依赖,这样当一个对象状态改变的时候,它的所有依赖者都会收到通知并自动更新。

设计原则:为了交互对象之间的松耦合设计而努力。
松耦合的设计让对象之间的依赖降到最低,这样便于建立更加有弹性的系统,应对变化。

实现观察者模式的方法不止一种,但是包含Subject和Observer接口的设计实现最常见。

主题只需要知道观察者实现了观察者接口Observer,不需要知道观察者的具体类是谁,做了什么。主题唯一依赖的是一个实现了观察者Observer接口的对象列表,可以随时增加,删除观察者,并方便地通知所有列表中的观察者。
观察者只需要持有一个主题的对象,用于注册成为主题的观察者,这样就可以接受到主题状态改变的通知。

观察者模式类图
这里写图片描述

主题是拥有数据或者状态的对象,观察者依赖主题来获取数据或者状态的改变。一个主题可以有多个观察者依赖它。主题负责在数据或者状态改变的时候,将改变通知所有依赖它的观察者。观察者必须注册具体主题,以便接受更新。

代码实现

/**
 *
 * @author Yves
 */
public interface Subject{
        public void Register(Observer o);
        public void Remove(Observer o);
        public void NotifyObservers();
}

这是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除。实现此接口的具体主题还必须实现NotifyObservers()方法用于在状态改变时通知所有的观察者。

class MySubject implements Subject {

    private String name;
    private int age;
    //observers list
    private ArrayList observers;   

    public MySubject() {
        //create observers list in the Contruct method.
        observers = new ArrayList();
    }

    @Override
    public void Register(Observer o) {
        observers.add(o);
    }

    @Override
    public void Remove(Observer o) {
        if (observers != null && !observers.isEmpty() && observers.contains(o)) {
            observers.remove(o);
        }
    }

    @Override
    public void NotifyObservers() {
        for (Object observer : observers) {
            Observer ob = (Observer) observer;
            ob.Update(name, age);
        }
    }

    public void ChangeDate(String name, int age) {
        this.SetName(name);
        this.SetAge(age);
        //notify all observers
        this.NotifyObservers();
    }

    public void SetName(String name) {
        this.name = name;
    }

    public void SetAge(int age) {
        this.age = age;
    }
}

具体主题类实现主题接口Subject,提供注册和删除观察者的方法,以及状态改变时通知所有观察者的方法。此处具体主题类维护一个ArrayList observers用来记录所有注册的观察者,以便实现注册、删除和通知观察者的方法。此外,具体主题类是拥有数据的对象,提供设置和获取这些数据的方法。ChangeDate(String name, int age)方法改变数据状态并且调用NotifyObservers()通知该主题维护的所有观察者。NotifyObservers()会调用每个观察者的Update()方法来实现数据状态改变的通知。

/**
 *
 * @author Yves
 */
 public interface Observer{
        public void Update(String name, int age);
 }

所有潜在观察者必须实现观察者接口,这个接口只有一个Update()方法,当主题状态改变时它被调用。

class ObserverA implements Observer {

    private String name;
    private int age;
    private MySubject mySubject;

    public ObserverA(MySubject mySubject) {
        this.mySubject = mySubject;
        //Register this observer to the observer list of Subject object.
        this.mySubject.Register(this);
    }

    @Override
    public void Update(String name, int age) {
        this.name = name;
        this.age = age;

        this.Display();
    }

    public void Display() {
        System.out.println("User name is: " + name + ", User age is: " + age);
    }

}

具体观察者实现观察者接口Observer,实现Update方法用于在主题的数据状态改变时更新这些数据状态。具体观察者必须注册主题,才能接收主题的更新通知。此处观察者持有一个具体主题的对象MySubject mySubject,在构造函数里面注册成为MySubject主题的观察者。

public class ObserverPattern {

    public static void main(String args[]){
        MySubject mys = new MySubject();
        ObserverA oba = new ObserverA(mys);
        //register an observer, THIS ACTIION is better done in the Observer class.
        //mys.Register(oba);
        //data change in MySubject, will notify all observers
        mys.ChangeDate("Yves", 18);
        //observers show the data
        oba.Display();
    }
}

注意:代码的实现不能依赖于观察者被通知的次序。因为一旦主题/观察者的实现改变了,通知的次序就会改变,依赖于某一特定实现的通知次序,是错误的。

Java API 内置观察者模式:java.util.Observable类和java.util.Observer为开发者接口提供了观察者模式。Observable类就是主题,具体的主题类需要继承Observable类。

由于Observable是一个类,所以具体主题就不能同时拥有Observable类和另一个超类的行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值