中介者模式是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。中介者模式的核心在于中介者这个角色,理解上可以参考现实中的中介者,中介就跟中间人一样,跟桥梁一样。比方说你到了个陌生的城市,要找工作,要找房子。如果一个人冒冒失失的盲目的找,不仅花费的时间跟精力非常大,即使找到了也不是理想中的。这时候中介就发挥作用了。它会根据你的要求,帮你安排那样的工作适合你,跟用人方取得联系。代码的世界里,如果各个类之间互相依赖,每个类内部引入其他类,当类增多时就会形成网状依赖关系(下图左),这时代码的耦合度就很高;中介者模式可以很好的解耦这种依赖关系,所有类都只和中介者有关联,形成一种星状结构(下图右),通过中介者建立联系,而彼此不需要知道对方是谁,彼此独立,耦合性很低 。
在软件开发过程中,我们经常会遇到一些复杂的问题,例如对象之间的通信、数据传递等,为了解决这些问题,我们可以使用一些设计模式,我们将介绍一种非常实用的设计模式——中介者模式。
中介者模式(Mediator Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个对象都有机会决定一个对象的行为,从而避免了命令模式中的紧耦合问题,中介者模式使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式的主要角色有以下几个:
1、抽象中介者(Abstract Mediator):定义了所有具体中介者所必须实现的接口。
2、具体中介者(Concrete Mediator):实现了抽象中介者所定义的接口,并提供了自己的业务逻辑。
3、抽象主题(Abstract Subject):定义了请求和其他对象进行交互的方法。
4、具体主题(Concrete Subject):实现了抽象主题所定义的方法,并与具体中介者一起协作。
5、抽象客户(Abstract Colleague):定义了与抽象主题交互的方法。
6、具体客户(Concrete Colleague):实现了抽象客户所定义的方法,并与具体主题一起协作。
下面我们通过一个简单的例子来说明中介者模式的用法:
假设我们有一个在线购物系统,系统中有三个实体:用户(User)、购物车(ShoppingCart)和订单(Order),用户可以在购物车中添加商品,然后创建订单,在这个过程中,我们需要考虑库存、价格等因素,为了简化问题,我们将把库存管理抽象成一个中介者——库存管理器(InventoryManager)。
我们定义一个抽象中介者——库存管理器:
public interface InventoryManager { boolean checkStock(String productId, int quantity); }
我们创建两个具体中介者:库存管理器A(InventoryManagerA)和库存管理器B(InventoryManagerB),分别负责不同的库存查询操作:
public class InventoryManagerA implements InventoryManager { @Override public boolean checkStock(String productId, int quantity) { // 实现具体的库存查询逻辑 } } public class InventoryManagerB implements InventoryManager { @Override public boolean checkStock(String productId, int quantity) { // 实现具体的库存查询逻辑 } }
我们定义一个抽象主题——购物车(ShoppingCart),它包含一个库存管理器成员变量,并提供一个方法来检查库存是否充足:
public abstract class ShoppingCart { protected InventoryManager inventoryManager; public ShoppingCart(InventoryManager inventoryManager) { this.inventoryManager = inventoryManager; } public abstract void addToCart(String productId, int quantity); }
我们创建两个具体主题:普通购物车(NormalShoppingCart)和限时购物车(TimeLimitedShoppingCart),它们分别实现了购物车的基本功能和限时购买功能:
public class NormalShoppingCart extends ShoppingCart { public NormalShoppingCart(InventoryManager inventoryManager) { super(inventoryManager); } @Override public void addToCart(String productId, int quantity) { if (inventoryManager.checkStock(productId, quantity)) { System.out.println("添加成功"); } else { System.out.println("库存不足"); } } } public class TimeLimitedShoppingCart extends ShoppingCart { private long expirationTime; public TimeLimitedShoppingCart(InventoryManager inventoryManager) { super(inventoryManager); this.expirationTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2); // 仅在2小时后有效 } @Override public void addToCart(String productId, int quantity) throws Exception { if (inventoryManager.checkStock(productId, quantity)) { System.out.println("添加成功"); } else if (System.currentTimeMillis() > expirationTime) { throw new Exception("已过期"); } else { System.out.println("库存不足"); } } }
我们定义一个抽象客户——用户(User),它需要与购物车进行交互以完成购买操作:
public abstract class User { protected ShoppingCart shoppingCart; public User(ShoppingCart shoppingCart) { this.shoppingCart = shoppingCart; } }