📜  门| GATE-CS-2016(套装2)|问题 25(1)

📅  最后修改于: 2023-12-03 15:42:18.755000             🧑  作者: Mango

GATE-CS-2016 (套装2) 问题 25

这个问题涉及到设计模式中的观察者模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并更新。

在本题中,我们需要实现一个观察者模式来模拟球赛成绩的展示。

观察者模式实现

我们需要有一个主题对象 Score,用来存储球赛的成绩,并提供更新成绩的接口。

class Score {
    private int homeScore;
    private int awayScore;
    private List<Observer> observers;

    public Score() {
        observers = new ArrayList<>();
    }

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void updateScore(int homeScore, int awayScore) {
        this.homeScore = homeScore;
        this.awayScore = awayScore;
        notifyObservers();
    }

    private void notifyObservers() {
        observers.forEach(observer -> observer.update(homeScore, awayScore));
    }
}

我们还需要有一个观察者接口 Observer,定义了一个更新方法 update,它会在主题对象的成绩发生改变时被调用。

interface Observer {
    void update(int homeScore, int awayScore);
}

我们需要实现两个观察者 ScoreDisplayScoreBoard 来展示球赛成绩。ScoreDisplay 会显示当前比分,ScoreBoard 会显示完整的比赛情况。

class ScoreDisplay implements Observer {
    @Override
    public void update(int homeScore, int awayScore) {
        System.out.println("Current Score - Home: " + homeScore + " Away: " + awayScore);
    }
}

class ScoreBoard implements Observer {
    private int homeScore;
    private int awayScore;

    @Override
    public void update(int homeScore, int awayScore) {
        this.homeScore = homeScore;
        this.awayScore = awayScore;
        displayScoreBoard();
    }

    private void displayScoreBoard() {
        System.out.println("Score Board - Home: " + homeScore + " Away: " + awayScore);
    }
}
使用观察者模式

我们可以在主方法中创建一个主题对象 Score 和两个观察者 ScoreDisplayScoreBoard,并将它们注册到主题对象中。然后,我们可以调用主题对象提供的更新成绩的接口,来模拟球赛成绩的变化。

public static void main(String[] args) {
    Score score = new Score();

    Observer scoreDisplay = new ScoreDisplay();
    Observer scoreBoard = new ScoreBoard();

    score.addObserver(scoreDisplay);
    score.addObserver(scoreBoard);

    // Simulate score change
    score.updateScore(1, 0);
    score.updateScore(1, 1);
    score.updateScore(2, 1);
}

输出结果如下:

Current Score - Home: 1 Away: 0
Score Board - Home: 1 Away: 0
Current Score - Home: 1 Away: 1
Score Board - Home: 1 Away: 1
Current Score - Home: 2 Away: 1
Score Board - Home: 2 Away: 1

以上就是观察者模式的一个实现,它可以用于实时展示球赛成绩或其他任何需要及时更新的情景。