有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中的观察者设计模式

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

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) {

    }

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


共 (4) 个答案

  1. # 1 楼答案

    您可以调用notifyObservers("season");,在观察者的update(Observable o, Object arg)中,第二个参数将是字符串"season"

    或声明为enum MyAttr {Season, DayInTime, Temperature}并调用notifyObservers(MyAttr.Season);

  2. # 2 楼答案

    如果seasondayInTimetemperature应同时发送给观察员,则最好调用:

    notifyObservers(season, dayInTime, temperature)
    

    而且{}可以有一个方法{},现在你知道是季节、白天还是温度

  3. # 3 楼答案

    根据您的代码,update(Observable o, Object arg)中的arg将是季节、时间或温度之一。notifyObservers()的参数是传递给update()的参数

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

  4. # 4 楼答案

    您可以在pull模式下使用observable模式,这意味着observable将自身传递给observable的update()。因此,观察者可以从被观察者的getter中获得他们想要的属性

    我假设你的主题中的temperaturedayInTimeseason都是int

    因此,您Observable(即主题)将看起来像:

    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();
    }