中介者模式是一种设计模式,用于在对象之间定义松散耦合的通信方式,使得对象之间不必显式地互相引用,降低系统的复杂度。中介者模式主要通过引入用于协调其他对象或类之间相互调用的中介者类,为了让系统具有具有更好的灵活性和扩展性。 ,,中介者模式的优点是可以降低系统的复杂度,提高代码的可维护性和可扩展性;缺点是增加了系统的复杂度,使得代码更加难以理解和调试。
在软件开发过程中,我们经常会遇到这样的问题:如何在对象之间传递复杂的信息?如何避免直接调用远程方法带来的性能损耗?如何实现松耦合的设计?这些问题可以通过使用中介者模式来解决。
中介者模式是一种行为型设计模式,它通过引入一个中介对象来封装一系列的交互操作,从而使各对象之间的交互变得简单和清晰,中介者模式主要包括以下几个角色:
1、抽象中介者(AbstractMediator):定义了中介者与各个抽象主题对象之间的交互接口,同时也定义了它们之间的通信协议,抽象中介者不能实例化,通常由具体的中介者类实现。
2、具体中介者(ConcreteMediator):实现了抽象中介者中定义的交互接口,负责协调各抽象主题对象之间的交互,具体中介者可以有多个,每个具体中介者负责管理一部分抽象主题对象。
3、抽象主题(AbstractSubject):定义了需要与其他对象进行交互的对象所需要实现的方法,抽象主题对象通常也是抽象中介者的一部分,但也可以是其他的具体主题类。
4、具体主题(ConcreteSubject):实现了抽象主题中定义的方法,同时也需要实现与抽象中介者的交互接口,具体主题对象通常包含一个或多个抽象主题对象。
5、客户端(Client):使用中介者模式的程序的普通用户,通过与抽象中介者和具体中介者的交互来完成任务,客户端不需要关心具体的中介者和主题是如何实现的。
通过使用中介者模式,我们可以将复杂的交互操作封装到中介者对象中,从而降低系统的耦合度,提高代码的可维护性和可扩展性,中介者模式还可以有效地减少系统间的通信开销,提高系统的性能。
下面我们通过一个简单的示例来说明如何使用中介者模式:
假设我们有一个在线购物系统,系统中有三个角色:用户(User)、商品(Product)和订单(Order),用户可以在系统中浏览商品、添加商品到购物车、下订单等操作;商品可以提供商品信息、价格等;订单则负责处理用户的购物车中的商品。
在这个系统中,我们可以使用中介者模式将用户、商品和订单这三个角色解耦,使得它们之间的交互更加清晰和简单,我们定义一个抽象中介者(OrderMediator),它负责协调用户、商品和订单之间的交互:
public abstract class OrderMediator { protected List<Product> productList = new ArrayList<>(); protected List<User> userList = new ArrayList<>(); public void addProduct(Product product) { productList.add(product); } public void addUser(User user) { userList.add(user); } public abstract void checkout(); }
我们定义两个具体中介者(OnlineOrderMediator和OfflineOrderMediator),分别用于处理在线和离线的订单操作:
public class OnlineOrderMediator extends OrderMediator { @Override public void checkout() { for (Product product : productList) { if (product.getStock() > 0) { product.reduceStock(); System.out.println("用户" + userList.get(0).getName() + "购买了商品" + product.getName()); } else { System.out.println("商品" + product.getName() + "已售罄"); } } } }
public class OfflineOrderMediator extends OrderMediator { @Override public void checkout() { for (Product product : productList) { if (product.getStock() > 0) { product.reduceStock(); System.out.println("用户" + userList.get(0).getName() + "购买了商品" + product.getName()); } else { System.out.println("商品" + product.getName() + "已售罄"); } } } }
我们定义一个抽象主题(User)和一个具体主题(PhysicalUser),分别表示系统中的用户实体和物理用户实体:
public abstract class User implements ProductListener { private String name; public User(String name) { this.name = name; } public String getName() { return name; } }
public class PhysicalUser extends User implements ProductListener { public PhysicalUser(String name) { super(name); } }
我们定义一个具体主题(PhysicalProduct),表示系统中的商品实体:
public class Product implements ProductListener, Subject { private String name; private double price; private int stock; private List<ProductListener> listeners = new ArrayList<>(); public Product(String name, double price, int stock) { this.name = name; this.price = price; this.stock = stock; } public String getName() { return name; } public double getPrice() { return price; }