做影视后期应该关注哪些网站,网站服务器地址怎么查,wordpress wp_term_taxonomy,人防工程做资料的网站中介者模式通过引入中介类降低对象间耦合度#xff0c;在电商平台中#xff0c;卖家、买家、物流公司和支付平台原本需复杂交互#xff0c;在引入“交易中介”类后#xff0c;各角色只需与中介交互#xff0c;由中介协调各方操作#xff0c;从而简化了交互流程#xff0… 中介者模式通过引入中介类降低对象间耦合度在电商平台中卖家、买家、物流公司和支付平台原本需复杂交互在引入“交易中介”类后各角色只需与中介交互由中介协调各方操作从而简化了交互流程降低了类间依赖使系统更灵活可维护。 定义 中介者模式主要用于减少类之间的耦合它用一个中介类来封装一系列对象间的交互使这些对象不需要显式地相互引用从而使其耦合松散而且可以独立地改变它们之间的交互。
举一个业务中的例子来说明假设有一个电商平台其中有卖家、买家、物流公司和支付平台四个角色在没有中介者的情况下这四个角色之间可能需要进行复杂的交互比如卖家要直接联系物流公司发货买家要直接联系支付平台进行支付等这样的设计会导致类之间的耦合度很高一旦某个角色发生变化可能会影响到其他角色。
而引入中介者模式后可以设计一个电商平台的“交易中介”类这个类中介了卖家、买家、物流公司和支付平台之间的所有交互卖家只需要将商品信息和买家信息提交给交易中介交易中介会负责联系物流公司进行发货并通知买家进行支付买家支付完成后交易中介会通知卖家和物流公司更新订单状态这样卖家、买家、物流公司和支付平台之间的耦合度就大大降低了每个角色只需要和交易中介进行交互而不需要直接和其他角色进行交互。
在这个场景中中交易中介类就起到了中介者的作用它将一系列对象间的交互封装起来使这些对象之间的耦合度降低提高了系统的灵活性和可维护性。
代码案例 反例
下面是一个未使用中介者模式的反例代码假如有一个聊天应用的简单模型其中包括User用户和GroupChat群聊类每个User对象都直接与其他User对象通信如下代码演示
public class User { private String name; public User(String name) { this.name name; } public String getName() { return name; } public void sendMessage(User receiver, String message) { System.out.println(name sends a message to receiver.getName() : message); }
} public class GroupChat { private ListUser users new ArrayList(); public void addUser(User user) { users.add(user); } public void notifyAllUsers(String message) { for (User user : users) { for (User otherUser : users) { if (!user.equals(otherUser)) { user.sendMessage(otherUser, message);} } } }
} public class Client { public static void main(String[] args) { User alice new User(Alice); User bob new User(Bob); User charlie new User(Charlie); GroupChat chat new GroupChat(); chat.addUser(alice); chat.addUser(bob); chat.addUser(charlie); alice.sendMessage(bob, Hi Bob, how are you?); alice.sendMessage(charlie, Hi Charlie, whats up?); chat.notifyAllUsers(Everyone, there will be a maintenance tonight.); }
}输出结果如下
Alice sends a message to Bob: Hi Bob, how are you?
Alice sends a message to Charlie: Hi Charlie, whats up?
Alice sends a message to Bob: Everyone, there will be a maintenance tonight.
Alice sends a message to Charlie: Everyone, there will be a maintenance tonight.
Bob sends a message to Alice: Everyone, there will be a maintenance tonight.
Bob sends a message to Charlie: Everyone, there will be a maintenance tonight.
Charlie sends a message to Alice: Everyone, there will be a maintenance tonight.
Charlie sends a message to Bob: Everyone, there will be a maintenance tonight.在这个反例中User类直接持有对其他User对象的引用并直接调用其方法这导致了类之间的紧密耦合因为User类需要知道如何与其他User对象通信此外GroupChat类虽然被设计出来但并没有起到中介消息的作用实际上当notifyAllUsers方法被调用时每个用户都会向其他每个用户发送消息导致了重复的消息和不必要的复杂性。
正例
下面是一个使用中介者模式的正例代码在这个例子中有一个聊天应用的模型包括User用户和ChatMediator聊天中介类ChatMediator类作为中介者封装了用户之间的通信逻辑使得用户之间不需要直接相互引用如下代码
import java.util.*; // User.java
public class User { private String name; private ChatMediator chatMediator; public User(String name, ChatMediator chatMediator) { this.name name; this.chatMediator chatMediator; } public String getName() { return name; } // 用户通过中介者发送消息 public void sendMessage(String receiverName, String message) { chatMediator.relayMessage(this, receiverName, message); }
} // ChatMediator.java
public class ChatMediator { private MapString, User users new HashMap(); public void registerUser(User user) { users.put(user.getName(), user); } // 中介者负责将消息传递给指定的接收者 public void relayMessage(User sender, String receiverName, String message) { User receiver users.get(receiverName); if (receiver ! null) { System.out.println(sender.getName() sends a message to receiver.getName() : message); // 这里可以添加额外的逻辑比如记录消息、通知其他服务等 } else { System.out.println(Receiver receiverName is not online.); } }
} // 客户端代码
public class Client { public static void main(String[] args) { // 创建中介者和用户 ChatMediator chatMediator new ChatMediator(); User alice new User(Alice, chatMediator); User bob new User(Bob, chatMediator); // 用户注册到中介者 chatMediator.registerUser(alice); chatMediator.registerUser(bob); // Alice通过中介者发送消息给Bob alice.sendMessage(Bob, Hi Bob, how are you?); // Bob通过中介者回复消息给Alice bob.sendMessage(Alice, Im good, thanks!); // 尝试发送消息给一个未注册的用户 alice.sendMessage(Charlie, Hey Charlie, are you there?); }
}输出结果
Alice sends a message to Bob: Hi Bob, how are you?
Bob sends a message to Alice: Im good, thanks!
Receiver Charlie is not online.在这个正例中User类不直接持有对其他User对象的引用而是通过ChatMediator中介者来发送消息ChatMediator维护了一个用户列表并负责将消息从发送者传递给接收者这样User类之间的耦合度降低了因为用户不需要知道如何与其他用户直接通信他们只需要与中介者交互。此外如果未来需要改变通信方式或添加额外的通信逻辑只需要修改ChatMediator类即可而不影响User类。
核心总结 中介者模式总结
通过引入中介者使得各个组件之间不再直接相互依赖减少了系统的复杂性他将原本分散的交互逻辑集中管理使得这些逻辑更加清晰和易于维护由于组件间的通信都通过中介者进行因此添加新组件或修改现有组件的交互方式变得更加容易。但随着系统的扩展它可能需要处理越来越多的交互逻辑导致其代码变得庞大且难以维护为了实现中介者模式有时可能需要创建额外的抽象类和接口这可能会增加系统的复杂性和理解难度。
在确实需要降低组件间耦合度的情况下使用中介者模式避免过度设计可以考虑与其他设计模式如观察者模式结合使用以实现更灵活和强大的功能。
和其它模式对比
中介者模式和装饰者模式两者的区别
中介者模式主要用于降低多个对象之间的耦合度通过引入一个中介者对象其它所有相关对象都通过该中介者对象进行通信而不是直接相互引用当中介者模式中的某一个对象发生改变时只需要通知中介者对象由中介者对象负责与其他对象的交互这样可以简化对象之间的交互降低系统的复杂性。
装饰者模式则侧重于在不改变对象自身的基础上动态地给对象添加新的功能或方法装饰者模式通过创建一个装饰类将原始类作为成员变量进行包装并在装饰类中提供与原始类相同的方法这些方法可以在调用原始类方法之前或之后执行一些额外的操作这样可以实现对原始类功能的动态扩展而无需修改原始类的代码。
总结中介者模式主要用于解决对象之间的紧耦合问题通过引入中介者来协调对象之间的交互而装饰者模式则主要用于在不改变原始类的基础上动态地给对象添加新的功能或方法。