文章内容
一、什么是中介者模式
中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又叫调停模式,属于行为型设计模式,是迪米特法则的典型应用。

二、中介者模式类图

三、中介者模式角色
- 抽象中介者角色(Mediator):抽象中介者角色定义统一的接口,以及一个或者多个事件方法,用于各同事角色之间的通信。
- 具体中介者角色(ConcreteMediator):实现了抽象中介者所声明的事件方法,协调各同事类之间的行为,持有所有同事类对象的引用。
- 抽象同事类角色(Colleague):定义了抽象同事类,持有抽象中介者对象的引用。
- 具体同事类角色(ConcreteColleague):继承抽象同事类,实现自己业务,通过中介者跟其他同事类进行通信。
四、中介者模式优缺点
优点:
- 通过将对象彼此解耦,可以增加对象的复用性。
- 通过将控制逻辑集中,可以简化系统维护。
- 可以让对象之间所传递的消息变得简单而且大幅减少。
- 提高系统的灵活性,使得系统易于扩展和维护。
缺点:
- 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响。
- 如果设计不当,中介者对象本身变得过于复杂,不易维护和管理。
五、中介者模式demo示例
1、Demo需求
使用中介者模式:设定公司总经理为中介者角色,公司各部门为具体同事角色,部门工作分为内部工作和外部工作。
2、接口及抽象类定义
1 2 3 4 5 6 7 8 | /** * 抽象中介者角色 */ public interface Mediator { void register(String name, Department department); void command(String name); } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | /** * 抽象同事角色 */ public abstract class Department { // 中介者对象 protected Mediator mediator; public Department(Mediator mediator) { this .mediator = mediator; } /** * 处理本部门内部事务 */ public abstract void executeInsideThing(); /** * 处理部门外的事务 */ public abstract void executeOutsideThing(); } |
3、实现类定义
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | /** * 具体中介者角色:总经理 */ public class PresidentMediator implements Mediator { private Map<String,Department> departmentMap = new HashMap<>(); public void register(String name, Department department) { departmentMap.put(name,department); } public void command(String name) { departmentMap.get(name).executeInsideThing(); departmentMap.get(name).executeOutsideThing(); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | /** * 具体同事角色:研发部类 */ public class DevelopmentDepartment extends Department { public DevelopmentDepartment(Mediator mediator) { super (mediator); mediator.register( "研发部" , this ); } @Override public void executeOutsideThing() { System.out.println( "研发部:汇报工作!资源不够,需要找人!" ); mediator.command( "财务部" ); } @Override public void executeInsideThing() { System.out.println( "研发部:专心科研,研发项目!" ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 | /** * 具体同事角色:财务部类 */ public class FinancialDepartment extends Department { public FinancialDepartment(Mediator mediator) { super (mediator); mediator.register( "财务部" , this ); } @Override public void executeInsideThing() { System.out.println( "财务部内部事务:1.收账款;2.算利润;3.发奖金" ); } @Override public void executeOutsideThing() { System.out.println( "财务部外部事务:提请总经理审批,搞投资理财,钱生钱。" ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | /** * 具体同事角色:市场部 */ public class MarketDepartment extends Department { public MarketDepartment(Mediator mediator) { super (mediator); mediator.register( "市场部" , this ); } @Override public void executeOutsideThing() { System.out.println( "市场部:1.找客户! 2.申请资金,投广告!" ); mediator.command( "财务部" ); } @Override public void executeInsideThing() { System.out.println( "市场部:制定工作计划!挖掘潜在客户!" ); } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | /** * @Description: 具体同事角色:人事部门类 **/ public class PersonnelDepartment extends Department { public PersonnelDepartment(Mediator mediator) { super (mediator); mediator.register( "人事部" , this ); } @Override public void executeInsideThing() { System.out.println( "人事部内部事务:1.招聘人才 2.组织公司活动" ); } @Override public void executeOutsideThing() { System.out.println( "人事部外部事务:向总经理申请活动经费." ); mediator.command( "财务部" ); } } |
4、测试
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /** * 中介者模式客戶端测试类 */ public class Client { public static void main(String[] args) { PresidentMediator president = new PresidentMediator(); DevelopmentDepartment development = new DevelopmentDepartment(president); FinancialDepartment financial = new FinancialDepartment(president); MarketDepartment market = new MarketDepartment(president); PersonnelDepartment personnel = new PersonnelDepartment(president); // 研发部 development.executeInsideThing(); development.executeOutsideThing(); System.out.println( "=========================================================" ); // 财务部 financial.executeInsideThing(); financial.executeOutsideThing(); System.out.println( "=========================================================" ); // 市场部 market.executeInsideThing(); market.executeOutsideThing(); System.out.println( "=========================================================" ); // 行政部 personnel.executeInsideThing(); personnel.executeOutsideThing(); } } |
控制台日志:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 | 研发部:专心科研,研发项目! 研发部:汇报工作!资源不够,需要找人! 财务部内部事务:1.收账款;2.算利润;3.发奖金 财务部外部事务:提请总经理审批,搞投资理财,钱生钱。 ========================================================= 财务部内部事务:1.收账款;2.算利润;3.发奖金 财务部外部事务:提请总经理审批,搞投资理财,钱生钱。 ========================================================= 市场部:制定工作计划!挖掘潜在客户! 市场部:1.找客户! 2.申请资金,投广告! 财务部内部事务:1.收账款;2.算利润;3.发奖金 财务部外部事务:提请总经理审批,搞投资理财,钱生钱。 ========================================================= 人事部内部事务:1.招聘人才 2.组织公司活动 人事部外部事务:向总经理申请活动经费. 财务部内部事务:1.收账款;2.算利润;3.发奖金 财务部外部事务:提请总经理审批,搞投资理财,钱生钱。 |