一、定义及原理
观察者模式是一种行为设计模式,其定义把对象间的一种依赖关系从静态转化为动态的,从而使得一个对象在其他对象的状态发生改变时被通知并自动更新。
观察者模式中,被观察者维护一个观察者列表,当被观察者的状态发生改变时,遍历观察者列表并调用观察者的统一接口,观察者根据被观察者的状态进行相应的处理。
二、实现方式
在C#中,可以通过委托和事件来实现观察者模式。
首先定义一个委托类型,表示观察者的处理方法:
public delegate void UpdateHandler(object sender, EventArgs e);
然后定义一个被观察者的抽象类或接口,用于添加和删除观察者,以及通知观察者:
public abstract class Subject
{
// 观察者列表
private List<UpdateHandler> observers = new List<UpdateHandler>();
// 注册观察者
public void Attach(UpdateHandler observer)
{
observers.Add(observer);
}
// 删除观察者
public void Detach(UpdateHandler observer)
{
observers.Remove(observer);
}
// 通知观察者
public void Notify(object sender, EventArgs e)
{
foreach (UpdateHandler observer in observers)
{
observer(sender, e);
}
}
}
被观察者的子类可以通过继承Subject类来实现添加、删除观察者和通知观察者的方法。
定义一个观察者的抽象类或接口:
public abstract class Observer
{
// 更新方法,被被观察者调用
public abstract void Update(object sender, EventArgs e);
}
观察者的子类需要实现Update方法,该方法中根据被观察者的状态进行相应的处理。
三、实例演示
以下是一个简单的实例,演示了观察者模式的用法。
被观察者类:
public class Product : Subject
{
private string name;
private double price;
public Product(string name, double price)
{
this.name = name;
this.price = price;
}
// 商品名称
public string Name
{
get { return name; }
set { name = value; }
}
// 商品价格
public double Price
{
get { return price; }
set { price = value; Notify(this, EventArgs.Empty); }
}
}
观察者类:
public class Customer : Observer
{
private string name;
public Customer(string name)
{
this.name = name;
}
// 更新方法
public override void Update(object sender, EventArgs e)
{
Product product = sender as Product;
Console.WriteLine($"顾客{name},您关注的商品{name}的价格已经从{product.Price - product.Price * 0.1}元变为{product.Price}元了!");
}
}
测试类:
class Program
{
static void Main(string[] args)
{
Product product = new Product("Surface Laptop", 9999.99);
// 添加观察者
Customer c1 = new Customer("张三");
Customer c2 = new Customer("李四");
product.Attach(c1.Update);
product.Attach(c2.Update);
// 修改商品价格
Console.WriteLine("修改商品价格为:8999.99");
product.Price = 8999.99;
Console.ReadKey();
}
}
输出结果:
修改商品价格为:8999.99 顾客张三,您关注的商品Surface Laptop的价格已经从8999.991元变为8999.99元了! 顾客李四,您关注的商品Surface Laptop的价格已经从8999.991元变为8999.99元了!
四、优缺点分析
优点:
- 解耦:观察者模式将被观察者和观察者解耦,使得它们可以独立演化。
- 扩展性:可以方便地增加新的观察者和被观察者,而不需要修改原有的代码。
- 灵活性:观察者模式可以实现松耦合,被观察者和观察者之间只是简单地约定了一种通信方式。
缺点:
- 过度使用:如果观察者太多或者观察者与被观察者之间的交互过于复杂,可能会导致代码的维护和理解变得更加困难。此时我们应该考虑使用其他方式替代观察者模式。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/272250.html
微信扫一扫
支付宝扫一扫