中介者模式是一种行为设计模式,它通过引入一个中介对象来封装一组对象的交互。外观模式则是一种结构设计模式,它通过为子系统中的一组接口提供一个一致的界面来简化访问。这两种模式在目的和实现上有很大的不同,但都可以有效地解决软件设计中的一些问题。
在面向对象编程中,设计模式是一种可重用的解决方案,用于解决在特定环境中经常出现的问题,中介者模式是一种行为设计模式,它通过引入一个中介者对象来封装一组对象之间的交互,这种模式的主要目标是减少对象之间的直接通信,从而降低系统的复杂性,提高代码的可维护性和可扩展性。
中介者模式的主要组成部分包括:
1、抽象中介者(Mediator):定义了一组对象共享的接口,负责协调各个对象之间的交互。
2、具体中介者(ConcreteMediator):实现抽象中介者定义的接口,处理对象之间的交互。
3、抽象同事类(Colleague):定义了一组对象的行为,每个对象都知道如何与其他对象进行交互,但不知道中介者的存在。
4、具体同事类(ConcreteColleague):实现抽象同事类定义的行为,与中介者和其他同事对象进行交互。
中介者模式的工作原理如下:
1、创建中介者对象和具体同事对象。
2、具体同事对象将中介者对象引用传递给其他同事对象。
3、当一个同事对象需要与其他同事对象进行交互时,它将请求发送给中介者对象。
4、中介者对象根据请求,协调各个同事对象的交互。
5、当交互完成后,中介者对象通知所有参与交互的同事对象。
中介者模式的优点:
1、降低系统的复杂性:通过引入中介者对象,减少了对象之间的直接通信,使得系统更加清晰和易于理解。
2、提高代码的可维护性:由于中介者对象负责协调各个对象之间的交互,当需要修改或添加新的交互逻辑时,只需修改中介者对象,而无需修改各个同事对象的代码。
3、提高代码的可扩展性:当需要添加新的同事对象时,只需实现抽象同事类,并将其注册到中介者对象中,即可实现与其他同事对象的交互。
中介者模式的缺点:
1、增加了系统的依赖性:由于同事对象需要依赖中介者对象进行交互,当中介者对象出现问题时,可能导致整个系统无法正常工作。
2、可能引入性能问题:由于中介者对象需要协调各个对象之间的交互,当系统中的对象数量较多时,中介者对象的处理能力可能成为系统的瓶颈。
下面是一个中介者模式的应用实例:
假设有一个在线购物网站,用户可以浏览商品、添加到购物车、下订单等操作,在这个场景中,用户、商品和订单都可以看作是同事对象,为了简化示例,我们将只考虑用户和商品两个同事对象。
我们定义抽象同事类User
和Product
,它们分别表示用户和商品:
class User: def __init__(self, name): self.name = name def view_product(self, product): pass def add_to_cart(self, product): pass class Product: def __init__(self, name, price): self.name = name self.price = price def view(self): pass
我们定义抽象中介者ShoppingCart
,它负责协调用户和商品的交互:
class ShoppingCart: def __init__(self): self.users = [] self.products = [] def register_user(self, user): self.users.append(user) def register_product(self, product): self.products.append(product) def notify_users(self, product): for user in self.users: user.view_product(product)
我们实现具体同事类User
和Product
,它们与中介者ShoppingCart
进行交互:
class ConcreteUser(User): def __init__(self, name, shopping_cart): super().__init__(name) self.shopping_cart = shopping_cart self.shopping_cart.register_user(self) def view_product(self, product): print(f"{self.name} is viewing {product.name}") def add_to_cart(self, product): self.shopping_cart.register_product(product) print(f"{self.name} added {product.name} to cart") class ConcreteProduct(Product): def __init__(self, name, price, shopping_cart): super().__init__(name, price) self.shopping_cart = shopping_cart self.shopping_cart.register_product(self) def view(self): print(f"{self.name} is available for purchase")
我们可以创建用户和商品对象,并观察它们之间的交互:
if __name__ == "__main__": shopping_cart = ShoppingCart() user1 = ConcreteUser("Alice", shopping_cart) user2 = ConcreteUser("Bob", shopping_cart) product = ConcreteProduct("Laptop", 1000, shopping_cart) user1.view_product(product) user1.add_to_cart(product) user2.view_product(product) user2.add_to_cart(product)
运行上述代码,我们可以看到用户和商品对象之间的交互是通过中介者ShoppingCart
进行的,这使得整个系统更加清晰和易于理解。