观察者模式(Observer
时间: 2024-06-20 15:04:04 浏览: 8
观察者模式,也称为发布-订阅模式或依赖注入模式,是软件设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式鼓励事件驱动的编程,将数据变化和通知解耦,使得系统更加灵活和可维护。
在观察者模式中,主要包括以下几个关键角色:
1. **主题(Subject)**:被观察的对象,负责维护一个观察者列表,并且当它的状态发生变化时,会通知所有注册的观察者。
2. **观察者(Observer)**:订阅主题更新的对象,包含一个或多个方法用于接收主题的通知。
3. **订阅/注册(Register/Unregister)**:观察者可以注册或注销自己对主题的关注。
4. **通知(Notify)**:主题负责通知所有已注册的观察者更新信息。
这种模式常用于事件处理、GUI编程(如Java的Swing或Python的Tkinter)、以及各种异步通信场景中。
相关问题
用C#有个高档的热水器,包含一个加热器,一个报警器和一个现实屏,我们给热水器它通上电,当水温超过95度的时候: 1、报警器会开始发出语音,告诉你水的温度; 2、液晶屏也会改变水温的显示,来提示水已经快烧开了。 请使用观察者模式Observer表述上述三个关系,并在main方法里进行测试。
观察者模式Observer是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,它的所有观察者都会收到通知并且自动更新。
在这个例子中,热水器是主题对象,加热器、报警器和显示屏是观察者对象。当热水器的水温超过95度时,加热器会停止加热,报警器会开始发出语音告警,并且显示屏上会显示水温已经快烧开了。
以下是用C#实现的代码:
```csharp
// 主题接口,定义了添加、删除和通知观察者的方法
public interface ISubject
{
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify();
}
// 观察者接口,定义了更新的方法
public interface IObserver
{
void Update(ISubject subject);
}
// 热水器类,实现了主题接口
public class Heater : ISubject
{
private List<IObserver> observers = new List<IObserver>(); // 观察者列表
private int temperature; // 水温
public void Attach(IObserver observer)
{
observers.Add(observer);
}
public void Detach(IObserver observer)
{
observers.Remove(observer);
}
public void Notify()
{
foreach (IObserver observer in observers)
{
observer.Update(this);
}
}
public void SetTemperature(int temperature)
{
this.temperature = temperature;
Console.WriteLine("当前水温为:" + temperature + "度。");
Notify(); // 发送通知
}
}
// 加热器类,实现了观察者接口
public class HeaterController : IObserver
{
public void Update(ISubject subject)
{
Heater heater = (Heater)subject;
if (heater != null && heater.temperature >= 95)
{
Console.WriteLine("加热器停止加热。");
}
}
}
// 报警器类,实现了观察者接口
public class AlarmController : IObserver
{
public void Update(ISubject subject)
{
Heater heater = (Heater)subject;
if (heater != null && heater.temperature >= 95)
{
Console.WriteLine("报警器开始发出语音告警。");
}
}
}
// 显示屏类,实现了观察者接口
public class DisplayController : IObserver
{
public void Update(ISubject subject)
{
Heater heater = (Heater)subject;
if (heater != null)
{
Console.WriteLine("液晶屏显示水温为:" + heater.temperature + "度。");
}
}
}
// 测试代码
static void Main(string[] args)
{
Heater heater = new Heater();
heater.Attach(new HeaterController()); // 添加加热器观察者
heater.Attach(new AlarmController()); // 添加报警器观察者
heater.Attach(new DisplayController()); // 添加显示屏观察者
heater.SetTemperature(50); // 设置水温为50度,不会发送通知
heater.SetTemperature(90); // 设置水温为90度,不会发送通知
heater.SetTemperature(100); // 设置水温为100度,会发送通知
}
```
输出结果如下:
```
当前水温为:50度。
当前水温为:90度。
当前水温为:100度。
加热器停止加热。
报警器开始发出语音告警。
液晶屏显示水温为:100度。
```
Android观察者模式
在Android中,观察者模式是一种常见的设计模式,它主要用于各种控件的监听。当一个控件的状态发生改变时,它会通知所有注册的观察者,观察者会立即响应并执行相应的操作。在Android中,我们通常使用匿名内部类来实现观察者模式,例如通过setOnClickListener()方法注册一个观察者。
观察者模式在Android中的应用非常广泛,例如ListView的Adapter、BroadcastReceiver等都是基于观察者模式实现的。通过观察者模式,Android应用程序可以更加灵活地响应用户的操作,提高用户体验。
除了在Android中的应用,观察者模式在JDK中也有典型应用,比如java.util.Observable和java.util.Observer类。在使用时,被观察者需要继承java.util.Observable类,观察者需要实现java.util.Observer接口。通过这两个类,我们可以很方便地实现观察者模式。