首页 > 其他分享 >观察者模式(Observer)

观察者模式(Observer)

时间:2022-11-27 13:11:12浏览次数:37  
标签:状态 Observer void getMyState 观察者 模式 public MyObserver

多个观察者关注同一个目标,当目标发生改变时,观察者们可以收到消息。

(立刻更新消息,或者想知道的时候更新消息。)

实现:

  1、自定义观察者:观察者与目标有一致的状态属性,目标持有观察者的引用。

  2、jdk自带的:

      java.util.Observable 类,实现它的类即可被观察(目标类)。

      核心方法:

setChanged();//通知观察者目标的信息已经修改
notifyObservers(state);//传入状态,修改观察者们通过update方法可获得state,即可修改状态

      java.util.Observer接口,实现它的类需要重写update 方法,昨晚观测者。

void update(Observable var1, Object var2);//var1 为目标对象,var为传过来的状态。

 


 

自定义观察者:

1、观察者接口:有观察者的统一方法:更新

public interface Observer {
    void update(Subject subject);//更新数据
}

2、具体观察者:

public class MyObserver implements Observer{
    private int myState;//统一状态变量

    @Override
    public void update(Subject s) {
        //改变为指定的状态
        myState = ((ConcreteSubject)s).getState();
    }

    public int getMyState() { return myState; }

    public void setMyState(int myState) { this.myState = myState; }
}

3、目标父类:统一需要实现的方法。

public class Subject {
    //观察者们
    protected List<Observer> list = new ArrayList<>();

    //注册一个观察者
    public void registerObserver(Observer o){ list.add(o); }
    //移除一个观察者
    public void removeObserver(Observer o){ list.remove(o); }
    //通知观察者们进行更新
    public void notifyAllObersvers(){
        for(Observer o:list){
            o.update(this);//更新为此时状态
        }
    }
}

4、目标:此处设计为目标状态一改变,就更新观察者们的状态。

public class ConcreteSubject extends Subject{
    private int state;//状态变量

    public int getState() { return state; }

    public void setState(int state) {
        this.state = state;
        //状态一改变,就通知观察者们更新状态
        this.notifyAllObersvers();
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        //创建目标
        ConcreteSubject  cs = new ConcreteSubject();
        //创建三个观察者
        MyObserver m1 = new MyObserver();
        MyObserver m2 = new MyObserver();
        MyObserver m3 = new MyObserver();
        //注册观察者
        cs.registerObserver(m1);
        cs.registerObserver(m2);
        cs.registerObserver(m3);

        System.out.println("m1状态为:"+m1.getMyState());
        System.out.println("m2状态为:"+m2.getMyState());
        System.out.println("m3状态为:"+m3.getMyState());
        //移除观察者3
        cs.removeObserver(m3);

        //改变状态
        cs.setState(123);


        System.out.println("m1状态为:"+m1.getMyState());
        System.out.println("m2状态为:"+m2.getMyState());
        System.out.println("m3状态为:"+m3.getMyState());
    }
}

测试结果:

 

 

 


 

使用jdk提供的目标父类 Observable 及观察者接口 Observer 实现

1、创建目标:

public class ConcreteSubject extends Observable {
    private int state;//统一的状态

    public void setState(int state) {
        this.state = state;
        setChanged();//目标的信息已经修改
        notifyObservers(state);//通知观察者们
    }

    public int getState() {
        return state;
    }
}

2、确定观察者模式:状态一变我就更新

public class MyObserver implements Observer {
    private int myState;//统一的状态类型

    @Override
    public void update(Observable observable, Object o) {
        //状态更新
        //方式1:
        myState = (int)o;
        //方式2:
        //myState = ((ConcreteSubject)observable).getState();
    }

    public int getMyState() { return myState; }

    public void setMyState(int myState) { this.myState = myState; }
}

3、测试:

public class Client {
    public static void main(String[] args) {
        //创建目标
        ConcreteSubject cs = new ConcreteSubject();
        //创建观察者
        MyObserver m1 = new MyObserver();
        MyObserver m2 = new MyObserver();
        MyObserver m3 = new MyObserver();
        //注册观察者
        cs.addObserver(m1);
        cs.addObserver(m2);
        cs.addObserver(m3);

        //查看状态
        System.out.println("m1状态为:"+m1.getMyState());
        System.out.println("m2状态为:"+m2.getMyState());
        System.out.println("m3状态为:"+m3.getMyState());
        
        //移除观察者2
        cs.deleteObserver(m2);
        
        //改变目标状态
        cs.setState(199);
        
        //查看状态
        System.out.println("m1状态为:"+m1.getMyState());
        System.out.println("m2状态为:"+m2.getMyState());
        System.out.println("m3状态为:"+m3.getMyState());
    }
}

测试结果:

 


 

 不过,在jdk 9 中这种方式被弃用了。

 

标签:状态,Observer,void,getMyState,观察者,模式,public,MyObserver
From: https://www.cnblogs.com/lurenjia-bky/p/16929500.html

相关文章

  • 【ClickHouse为什么这么快?】Hyperscan 超扫描算法:用于现代CPU的“快速-多模式”正则表
    ASIMDinstructionexecutesthesameoperationonmultipledatainparallel.ASIMDOperationASIMDoperationisperformedon multiplelanesoftwoSIMDregiste......
  • 17-设计模式
    typora-root-url:images一、概述​ 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。​ 设计模式免去我们自己再思考......
  • Win7+IIS7下用FastCGI模式配置PHP环境
    今天看中了个PHP的程序想本地调试,因为我用的是WIN7的系统和自带的IIS7,又不想去下载apache服务器,记得以前看过让IIS支持PHP的方法,是使用isapi方式加载的,听说现在php5.3已经......
  • 转载:stm32——GPIO的定义、模式、初始化结构体变量、常用库函数与编程套路
    一、GPIO定义GPIO(GENERALPURPOSEI/OPORTS)意思为通用输入/输出端口,可以为CPU提供数字输入输出功能。通俗地说,就是一些引脚,CPU可以通过它们输出高低电平或者通过它们读入......
  • 字符串模式匹配算法 C++
    #include<iostream>#include<vector>#include<string>usingnamespacestd;//处理模式串,每一个位置都赋值为已匹配的位数vector<int>next_pos(stringpattern){ ......
  • 23种设计模式
    23种设计模式1、了解设计模式设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,他不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性......
  • 状态模式(State)
    当类的行为是基于它的状态改变时,使用状态模式。比如红绿灯控制路口司机的行为。应用:用来解决系统中复杂对象的状态转换,以及不同状态下的行为封装问题。结构:Sta......
  • 模板方法模式(Template)
    做一件事情,流程是固定的,其中存在不确定的同一类事务。例如:去店里吃饭:1、进入店铺。2、点单。3、吃饭。不确定的是第二步:点单。实现:在父类中定义好统一的......
  • 策略模式(Strategy)
    当处理同一个对象有多个处理算法的时候,使用一个策略对象来选择处理算法。  例子:对于客户的优惠率。算法实现统一的接口:publicinterfaceStrategy{pub......
  • 设计模式之创建型模式
    创建型模式:提供创建对象的机制,提升已有代码的灵活性和可复⽤性。PS:博客根据it老齐大话设计模式课程课件进行整理,IT老齐视频学习网站:https://www.itlaoqi.com包含的设......