中介者模式
定义:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以改变他们之间的交互。比方说,甲和乙沟通交流,甲乙之间是直接交流,但是交流对象并不局限于两者之间,可以扩展为一人与多人对话,如此交互对象类之间则形成强耦合,改善方法则是,新建一个中介者,把交互行为转移到中介者类
UML类图
使用示例
-
Mediator 抽象中介者
-
DemoMediator 具体中介者
-
User 抽象交互者
-
DemoUser DemoUser1 具体交互者
中介者设置所有具体交互者为成员变量,从而完成对象之间的交互,交互者也需要设置自己的中介者,需要交互时,可调用中介者完成交互
package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:21 */ public abstract class Mediator { public abstract void send(String msg,User user); } package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:25 */ public class DemoMediator extends Mediator{ private DemoUser demoUser; private DemoUser1 demoUser1; public void setDemoUser(DemoUser demoUser) { this.demoUser = demoUser; } public void setDemoUser1(DemoUser1 demoUser1) { this.demoUser1 = demoUser1; } @Override public void send(String msg, User user) { if(user== demoUser){ demoUser1.notify(msg); }else{ demoUser.notify(msg); } } }
package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:24 */ public abstract class User { protected Mediator mediator; public User(Mediator mediator) { this.mediator = mediator; } } package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:25 */ public class DemoUser extends User{ public DemoUser(Mediator mediator) { super(mediator); } public void send(String msg){ mediator.send("DemoUser1 send:"+ msg,this); } public void notify(String msg){ System.out.println("DemoUser1 recieve:"+ msg); } } package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:26 */ public class DemoUser1 extends User{ public DemoUser1(Mediator mediator) { super(mediator); } public void send(String msg){ mediator.send("DemoUser2 send:"+ msg,this); } public void notify(String msg){ System.out.println("DemoUser2 recieve:"+ msg); } }
package demo; /** * @author 州牧 * @description * @since 2022-04-22 19:33 */ public class Client { public static void main(String[] args) { DemoMediator mediator = new DemoMediator(); DemoUser user1 = new DemoUser(mediator); DemoUser1 user2 = new DemoUser1(mediator); mediator.setDemoUser(user1); mediator.setDemoUser1(user2); user1.send("什么模式?"); user2.send("中介者模式"); } } /* DemoUser2 recieve:DemoUser1 send:什么模式? DemoUser1 recieve:DemoUser2 send:中介者模式 */
中介者的优点和缺点
很明显,中介者是将交互的行为集中了,减少了交互对象之间的耦合。因此可以对交互对象和中介者对象进行独立的改变和复用。但是这同样也是缺点,此模式把交互对象之间的复杂性转移到了中介者,使用时需要考虑。
中介者模式一般应用于一组对象以定义良好但是以复杂的方式进行通信的场合,以及定制一个分布在多个类的行为,又不想生成太多的子类。GUI编程是个经典的例子。