中介者模式和外观模式都是软件设计模式,但是它们的作用不同。中介者模式是一种行为型设计模式,通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。而外观模式则是一种结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一接口,降低子系统与客户端的耦合度,且客户端调用非常方便 。
在软件开发过程中,我们经常会遇到各种复杂的问题,例如对象之间的通信、数据共享等,为了解决这些问题,我们可以借鉴各种设计模式,我们将介绍一种非常实用的设计模式——中介者模式。
中介者模式是一种结构型设计模式,它通过引入一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式的主要角色有以下几个:
1、抽象中介者(AbstractMediator):定义了中介者的基本操作,如获取被代理的各个对象和通知它们的更新。
2、具体中介者(ConcreteMediator):实现了抽象中介者的方法,负责维护被代理对象的引用,并在需要时调用它们的方法。
3、抽象主题(AbstractSubject):定义了主题所需要通知的事件,如添加、删除和修改操作。
4、具体主题(ConcreteSubject):实现了抽象主题的方法,用于注册和注销观察者,以及通知观察者有关事件的发生。
5、抽象观察者(AbstractObserver):定义了观察者所需的接口,如更新方法。
6、具体观察者(ConcreteObserver):实现了抽象观察者的方法,用于接收并处理来自主题的通知。
下面我们通过一个简单的例子来说明中介者模式的用法,假设我们有一个在线购物系统,其中包含多个商品和用户,用户可以对商品进行浏览、添加到购物车、下订单等操作,在这个系统中,我们需要实现以下功能:
1、用户可以浏览商品列表。
2、用户可以将商品添加到购物车。
3、用户可以查看购物车中的商品。
4、用户可以下订单并支付。
5、系统可以向用户发送订单状态的通知。
为了实现这些功能,我们可以使用中介者模式,我们需要定义一个抽象中介者类(Order),用于封装与订单相关的操作,我们需要为每个具体功能创建一个具体的中介者类(BrowseOrdersMediator、AddToCartMediator、ViewCartMediator和CheckoutMediator),我们需要定义一个抽象主题类(User)和一个具体主题类(OnlineUser),分别表示用户和在线用户。
下面是使用中介者模式实现上述功能的伪代码:
class Order: def __init__(self): self._observers = [] def register_observer(self, observer): self._observers.append(observer) def notify_observers(self, message): for observer in self._observers: observer.update(message) class User: def __init__(self): self._order = Order() def browse_orders(self): # 实现浏览订单的功能 def add_to_cart(self, item): # 实现添加商品到购物车的功能 self._order.notify_observers("Item added to cart") def view_cart(self): # 实现查看购物车的功能 class OnlineUser(User): _mediator = BrowseOrdersMediator() _mediator.register_observer(self) _mediator.register_observer(CheckoutMediator()) _mediator.register_observer(PayPalMediator()) def checkout(self): # 实现下订单并支付的功能 self._mediator.notify_observers("Order placed") class BrowseOrdersMediator: ... class AddToCartMediator: ... class ViewCartMediator: ... class CheckoutMediator: ... class PayPalMediator: ...
通过使用中介者模式,我们可以将与订单相关的操作与用户界面分离,使得系统更加易于扩展和维护,由于中介者对象负责管理被代理对象的引用,因此当某个被代理对象发生变化时,所有依赖于它的对象都会得到通知,从而避免了潜在的问题。