Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的观察者设计模式_Java_Design Patterns - Fatal编程技术网

java中的观察者设计模式

java中的观察者设计模式,java,design-patterns,Java,Design Patterns,我已经为一个观察者和可观察的设计模式发送了以下通知 private void changeEnvironment() { Random random = new Random(); season = SEASON[random.nextInt(3)]; dayInTime = DAY_IN_TIME[random.nextInt(2)]; temperature = random.nextInt(120);

我已经为一个观察者和可观察的设计模式发送了以下通知

private void changeEnvironment()
    {
        Random random = new Random();
        season = SEASON[random.nextInt(3)];
        dayInTime = DAY_IN_TIME[random.nextInt(2)];
        temperature = random.nextInt(120);
        setChanged();
        notifyObservers(season);
        notifyObservers(dayInTime);
        notifyObservers(temperature);
    }
然而,在我的发言中:

public void update(Observable o, Object arg) {

    }

如何检查是季节、白天还是温度?

根据您的代码,
更新中的
arg
将是季节、白天还是温度之一。
notifyObservers()
的参数是传递给
update()
的参数


您可能希望在自定义“事件”对象中包含更多元数据,并将其用作调用
notifyobserver()
的参数

根据您的代码,
更新中的
arg
将是季节、日期或温度之一。
notifyObservers()
的参数是传递给
update()
的参数


您可能希望在自定义“事件”对象中包含更多元数据,并将其用作调用
notifyobserver()
的参数

您可以调用
notifyObservators(“季节”)
并且在观察者的
更新(可观察的o,对象arg)
中,第二个参数将是字符串
“季节”


或者声明一个
enum MyAttr{seasure,DayInTime,Temperature}
并调用
notifyobservators(MyAttr.seasure)

您可以调用
通知观察员(“季节”)
并且在观察者的
更新(可观察的o,对象arg)
中,第二个参数将是字符串
“季节”


或者声明一个
enum MyAttr{seasure,DayInTime,Temperature}
并调用
notifyobservators(MyAttr.seasure)

您可以在拉模式下使用observable模式,这意味着observable将自身传递给observable的
更新()
。因此,observable可以从observable的getter中获取所需的属性

我假设你的主题中的
温度
白天
季节
都是
int

因此,您的
可观察的
(即受试者)将如下所示:

public class Subject extends Observable{

    private int temperature;
    private int dayInTime;
    private int season;

    private void changeEnvironment() {
        Random random = new Random();
        this.season = SEASON[random.nextInt(3)];
        this.dayInTime = DAY_IN_TIME[random.nextInt(2)];
        this.temperature = random.nextInt(120);
        setChanged();

         /** Notify all of the subscribed observers about its changes
          It will call each observers' update(this, null)***/
        notifyObservers();
    }


    public int getTemperature(){....}
    public int getdayInTime(){.....}
    public int getSeason(){....}

}
然后,您的观察者可以使用您的可观察对象的相应getter获得温度、dayInTime和季节:

public void update(Observable o, Object arg) {

   Subject = (Subject) o;
   int temperature = o.getTemperature();
   int dayInTime= o.getdayInTime();
   int season= o.getSeason();
}

您可以在pull模式下使用observable模式,这意味着observable将自身传递给observable的
update()
。因此,observable可以从observable的getter获取所需的属性

我假设你的主题中的
温度
白天
季节
都是
int

因此,您的
可观察的
(即受试者)将如下所示:

public class Subject extends Observable{

    private int temperature;
    private int dayInTime;
    private int season;

    private void changeEnvironment() {
        Random random = new Random();
        this.season = SEASON[random.nextInt(3)];
        this.dayInTime = DAY_IN_TIME[random.nextInt(2)];
        this.temperature = random.nextInt(120);
        setChanged();

         /** Notify all of the subscribed observers about its changes
          It will call each observers' update(this, null)***/
        notifyObservers();
    }


    public int getTemperature(){....}
    public int getdayInTime(){.....}
    public int getSeason(){....}

}
然后,您的观察者可以使用您的可观察对象的相应getter获得温度、dayInTime和季节:

public void update(Observable o, Object arg) {

   Subject = (Subject) o;
   int temperature = o.getTemperature();
   int dayInTime= o.getdayInTime();
   int season= o.getSeason();
}

如果应同时将
季节
白天时间
温度
发送给观察者,则最好拨打:

notifyObservers(season, dayInTime, temperature)

Observer
可以有一个方法
更新(对象季节、对象日期时间、对象温度)
,现在你知道是季节、日期时间还是温度了。

如果
季节
日期时间
温度
应该同时发送给观察者,最好调用:

notifyObservers(season, dayInTime, temperature)

观测者可以有一个方法更新(对象季节、对象日期时间、对象温度)
,现在你知道是季节、日期时间还是温度。

季节和日期时间的类型是什么?你可能会感兴趣。它描述了如何使用现代Java工具构建观察者设计模式实现季节和白天的类型是什么?你可能会感兴趣。它描述了如何使用现代Java工具构建观察者设计模式实现