观察者模式是一种软件设计模式,用于在对象之间定义一对多的依赖关系。在这个模式中,一个对象(主题)发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。
这种类型的设计模式是行为型模式的一种,因为它可以用于改变对象之间的通信方式,从而改变它们的行为。
类图是一种图形表示法,用于显示系统的类、接口和它们之间的关系。它可用于识别和测试软件系统中的类之间的关系。类图中的触发器行为在系统中发生某些事情时触发一个事件。
类图触发器是一个细粒度的观察者模式,它提供了通知目标对象的能力,使得这些对象可以在自己的命名空间内执行动作。因此,观察者模式类图触发器可以作为一个设计模式的成分来使用,以便为其他面向对象编程语言中的设计提供引导。
实现观察者模式的三种类图
- 简单的观察者模式:该模式通常由两个接口组成,即观察者接口和主题接口。观察者接口用于使观察者能够接收自己的通知,并且主题接口用于让对主题感兴趣的观察者注册自己。该模式的实现将使我们的代码灵活,但需要不断重复相同的代码。
下面是一个简单的观察者模式类图:

- 可配置性观察者模式:具有这种模式的观察者可以选择哪个主题通知,而不使用observable中的默认设置。因此,当对系统改变有多种响应时,这种模式更有用。下图是可配置性观察者模式类图:

- 带守护程序的观察者模式:将逻辑集成到我们的模型中。它包括了一个额外的类型,它被称为保护程序。保护程序可以在状态改变时调节观察者。
下图是带守护程序的观察者模式类图:

如何实现类图触发器?
创建一个类来负责触发事件。这个类是主题类,具有一些需要被通知变化的属性和方法。
一个观察者接口用于定义被通知的方法,这个方法将在主题发生变化时调用。这个接口将用于创建一个观察者对象。
在主题类上传入观察者对象,并在主题类发生改变时通知观察者。
现在我们将实现一个简单的类图触发器以演示观察者模式。它将包括一个主题类,三个观察者,以及一个客户端程序,用于操作。

下面是用Java实现观察者模式的代码:
```
import java.util.*;
interface Observer {
public void update(int num);
}
class Subject {
private ArrayList
private int number;
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer o : observers) {
o.update(number);
}
}
public void setNumber(int number) {
this.number = number;
notifyObservers();
}
}
class BinaryObserver implements Observer {
public void update(int num) {
System.out.println("Binary String: " + Integer.toBinaryString(num));
}
}
class OctalObserver implements Observer {
public void update(int num) {
System.out.println("Octal String: " + Integer.toOctalString(num));
}
}
class HexaObserver implements Observer {
public void update(int num) {
System.out.println("Hex String: " + Integer.toHexString(num));
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new BinaryObserver().attach(subject);
new OctalObserver().attach(subject);
new HexaObserver().attach(subject);
System.out.println("First state change: 15");
subject.setNumber(15);
System.out.println("\nSecond state change: 10");
subject.setNumber(10);
}
}
```
扫码咨询 领取资料