一、定义及原理
观察者模式是一种行为设计模式,其定义把对象间的一种依赖关系从静态转化为动态的,从而使得一个对象在其他对象的状态发生改变时被通知并自动更新。
观察者模式中,被观察者维护一个观察者列表,当被观察者的状态发生改变时,遍历观察者列表并调用观察者的统一接口,观察者根据被观察者的状态进行相应的处理。
二、实现方式
在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元了!
四、优缺点分析
优点:
- 解耦:观察者模式将被观察者和观察者解耦,使得它们可以独立演化。
- 扩展性:可以方便地增加新的观察者和被观察者,而不需要修改原有的代码。
- 灵活性:观察者模式可以实现松耦合,被观察者和观察者之间只是简单地约定了一种通信方式。
缺点:
- 过度使用:如果观察者太多或者观察者与被观察者之间的交互过于复杂,可能会导致代码的维护和理解变得更加困难。此时我们应该考虑使用其他方式替代观察者模式。