中介者模式是一种高效解耦的软件设计模式,它通过将对象之间的通信封装到一个中介者对象中,从而实现对象之间的松耦合。中介者模式的优点包括减少对象之间的依赖性,提高代码的可维护性和可扩展性;中介者将系统内部的交互逻辑集中在一起,降低了系统中对象之间的耦合度;可以简化对象之间的相互通信,使其更加灵活、易于扩展和维护;可以将系统中的复杂性分解到中介者中,使得各个模块职责更加分明,易于管理和维护。 ,,缺点包括中介者模式的实现需要在系统内部引入一个中介者对象,增加了系统的复杂性;中介者对象可能会变得过于复杂,难以维护和拓展;中介者模式会导致系统中对象之间的通信变得间接,降低了通信效率;中介者对象可能会成为系统的瓶颈,影响系统的性能。 ,,应用场景包括:当多个对象之间需要进行交互时,但是这些对象之间存在一些耦合关系时;当需要对多个对象进行协调时;当需要对多个对象进行通知时;当需要对多个对象进行分组处理时。
在软件开发过程中,我们经常会遇到一些复杂的问题,例如系统中的各个组件之间的交互、数据传递等,为了解决这些问题,我们可以采用一些设计模式来提高代码的可读性和可维护性,本文将介绍一种非常实用的设计模式——中介者模式。
中介者模式是一种行为型设计模式,它通过引入一个中介对象来封装一系列的对象交互,从而使这些对象之间的交互松散耦合,降低了系统的复杂性,中介者模式的主要作用是协调各个对象之间的关系,使得它们可以独立地进行工作,同时保持它们之间的协作。
中介者模式包括两种角色:抽象中介者(AbstractMediator)和具体中介者(ConcreteMediator),抽象中介者定义了一组接口,用于协调各个对象之间的交互;具体中介者则实现了这些接口,负责处理具体的交互逻辑。
下面我们通过一个简单的例子来说明中介者模式的使用,假设我们有一个在线购物系统,其中包含了用户、商品和订单三个实体,用户可以浏览商品、添加商品到购物车、下订单等操作;商品包含了名称、价格等属性;订单包含了商品列表、总价等信息,在这个系统中,我们需要实现用户与商品之间的交互,以及用户与订单之间的交互,为了实现这些交互,我们可以使用中介者模式。
我们定义一个抽象中介者(Order),它包含一个抽象的子类(ProductOrder):
public abstract class AbstractOrder { protected List<Product> productList = new ArrayList<>(); public void addProduct(Product product) { productList.add(product); } public abstract double getTotalPrice(); }
我们定义一个具体中介者(ShoppingCart),它继承自抽象中介者(Order):
public class ShoppingCart extends AbstractOrder { @Override public double getTotalPrice() { double totalPrice = 0; for (Product product : productList) { totalPrice += product.getPrice(); } return totalPrice; } }
我们定义一个具体中介者(User),它也继承自抽象中介者(Order):
public class User extends AbstractOrder { private String username; private ShoppingCart shoppingCart; public User(String username) { this.username = username; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public ShoppingCart getShoppingCart() { return shoppingCart; } public void setShoppingCart(ShoppingCart shoppingCart) { this.shoppingCart = shoppingCart; } }
我们定义一个抽象产品类(Product),它包含名称和价格两个属性:
public abstract class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } }