设计模式-观察者模式

本文介绍了Java中的观察者模式,通过MetaDataObservable和Observer接口实现实时数据模型操作的通知。当数据模型如表、字段或索引变化时,会触发MetaDataObserver子类的行为调整,保持数据一致性。
摘要由CSDN通过智能技术生成

角色描述

1、抽象主题(Subject):

它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

2、具体主题(Concrete Subject):

将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

3、抽象观察者(Observer):

为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

4、具体观察者(Concrete Observer):

实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 [3] 

---------------------------------------------------------------------------------------------------------------

观察者模式是一对多的关系,被观察者(主题)发生变化时通知所有观察者,使得观察者的状态更新和被观察者一致。被观察者和观察者都依赖于抽象,使得两者解耦。

在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了JDK对观察者模式的支持。

使用时,主题(被观察者)只需要实现Observable,观察者实现Observer来使用观察者模式。

以数据模型为例,当增加修改,删除数据模型时,需要同时处理基础表,字段表,索引约束表等信息,以数据模型为主题(被观察者),字段,表信息 ,索引约束等为观察者,当数据模型被增加修改删除时,其他的几个观察者需要作出相应的变更操作,保证与被观察者状态一致。

被观察者(主题)

package com.example.demo.gczModel;


import java.util.Observable;

public class MetaDataObservable extends Observable {

    public void setDate(String operType,String arg1,String arg2){
        this.setChanged();
        this.notifyObservers(new String[]{operType,arg1,arg2});
    }
}

观察者

package com.example.demo.gczModel;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Observable;
import java.util.Observer;

public class MetaDataObserver implements Observer {
    private static Logger logger=LoggerFactory.getLogger(MetaDataObserver.class);
    @Override
    public void update(Observable o, Object arg) {
        if(arg instanceof  String[]){
            String[] targtArgs = (String[]) arg;
            String operType = targtArgs[0];
            String arg1 = targtArgs[1];
            String arg2 = targtArgs[2];
            //TODO 根据具体参数处理
            if("update".equals(operType)){
                updateMethod(arg1,arg2);
            }
            else if("del".equals(operType)){
                delMethod(arg1,arg2);
            }else if("add".equals(operType)){
                addMethod(arg1,arg2);
            }else{
                logger.info("无效的相应操作:【{}】",operType);
            }
        }
    }

     void addMethod(String arg1, String arg2) {

    }

     void delMethod(String arg1, String arg2) {

    }

     void updateMethod(String arg1, String arg2) {

    }
}
package com.example.demo.gczModel;

public class MetaDataFieldObserver extends MetaDataObserver{
    @Override
     void addMethod(String arg1, String arg2) {

    }
    @Override
     void delMethod(String arg1, String arg2) {

    }
    @Override
     void updateMethod(String arg1, String arg2) {

    }
}
package com.example.demo.gczModel;

public class MetaDataViewObserver extends MetaDataObserver{
    @Override
    void addMethod(String arg1, String arg2) {

    }
    @Override
    void delMethod(String arg1, String arg2) {

    }
    @Override
    void updateMethod(String arg1, String arg2) {

    }
}

测试使用类

package com.example.demo.gczModel;

public class test {
    private MetaDataObservable metaDataObservable;
    public test(){
        this.metaDataObservable=new MetaDataObservable();
        MetaDataObserver metaDataFieldObserver = new MetaDataFieldObserver();
        MetaDataObserver metaDataViewObserver = new MetaDataViewObserver();
        metaDataObservable.addObserver(metaDataFieldObserver);
        metaDataObservable.addObserver(metaDataViewObserver);
    }

    public void operatedel(){
        this.metaDataObservable.setDate("del","aaa","bbb");
    }
    public void operateadd(){
        this.metaDataObservable.setDate("add","aaa","bbb");
    }

    public void main(String[] args) {
        this.operateadd();
        this.operatedel();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值