2019年11月11日08:45:25
设计模式
从前的日色变得慢ide
车,马,邮件都慢post
一辈子只够爱一我的测试
中介者模式(mediator pattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地互相引用,从而使其耦合松散,并且能够独立地改变它们的交互。————《设计模式:可复用面向对象软件的基础》this
中介者模式是一种对象行为型模式。设计
从木心这首小诗中的“邮件”中,讨论一下中介者模式。3d
好久好久之前,你和她住在一个很大很大的村子里面,你住在村的东边,她住在村的西边。code
那年你才十八,她也正值青春年华,正月十五元宵节,你赏灯之时,她回首处,你一见倾心。对象
日后的日子里,你天天都到她家送情书。送了99天,你想这不是办法,天天大半天浪费在路上,没时间赚钱。因而你想了一个办法,创办邮局,天天替村东边的人送信件给村西边的人,一箭双雕。慢慢邮局愈来愈大,南边的人经过邮局来给北边的人送信件,你找了几个伙计,从南到北,从北到南送信。blog
多年后,你富甲一方,也娶了当年的她。
“邮局”就是中介者模式中的中介者,“你”和“她”就是中介者中的同事。
中介者模式结构图:
从中介者模式结构图中可知,有如下4个角色:
这是一个悲伤的故事,住在村东边的你经过邮局给村西边的她表白,她说,她已经有男友了。
类图:
抽象中介者角色:
public interface PostOffice { /** * 送信 */ void deliverLetters(String letters, String receiver); /** * 添加收信人 */ void addPeople(Villager villager); }
具体中介者角色:
public class PostOfficeImpl implements PostOffice { /** * 收信人信息 */ private HashMap villagerMap = new HashMap<String, Villager>(); @Override public void addPeople(Villager villager) { villagerMap.put(villager.getClass().getSimpleName(), villager); } @Override public void deliverLetters(String letters, String receiver) { System.out.println("=>收信:邮局收到要寄的信"); Villager villager = (Villager) villagerMap.get(receiver); System.out.println("=>送信:拿出地址本查询收信人地址是:" + villager.getAddress() + ",送信"); System.out.println("=>收信人看信:"); villager.receiveLetter(letters); } }
抽象同事类角色:
public abstract class Villager { protected PostOffice postOffice; protected String address; Villager(PostOffice postOffice, String address) { this.postOffice = postOffice; this.address = address; } public void receiveLetter(String letter) { System.out.println(letter); } public void sendLetter(String letter, String receiver) { postOffice.deliverLetters(letter, receiver); } public String getAddress() { return address; } }
具体同事类角色:
// 她 public class She extends Villager { She(PostOffice postOffice, String address) { super(postOffice, address); } } // 你 public class You extends Villager { public You(PostOffice postOffice, String address) { super(postOffice, address); } }
中介者模式测试类:
public class MediatorPatternTest { public static void main(String[] args) { PostOffice postOffice = new PostOfficeImpl(); She she = new She(postOffice, "村西边"); You you = new You(postOffice, "村东边"); postOffice.addPeople(she); postOffice.addPeople(you); you.sendLetter("正月十五,元宵之夜,一见钟情", "She"); she.sendLetter("对不起,我已经有男友了", "You"); } }
测试结果:
村子很大,人不少,关系很复杂:系统中存在不少对象,对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解,使得对象没法重用
人与人之间书信交流:对象间存在某种共性交互行为,用中介者封装这种行为
在这个很大的村子里面,每一个人要给不一样人的送信,这种关系成网状结构,错综复杂。
加入邮局中介者以后,成星状结构,每一个人只和邮局有关系。
总结:系统中存在不少对象,对象间存在复杂的关系,在复杂的关系中存在共性交互行为,封装共性交互行为就是中介者。
中介者模式很容易在系统中应用,也很容易在系统中无用。当系统出现了“多对多”交互复杂的对象群是,不要急于使用中介者模式,而要先反思你的系统在设计上是否是合理。
实例有:联合国,聊天室等。
中介者模式是应用迪米特法则的典型。
迪米特法则:只与你最直接的朋友交流(Only talk to you immediate friends.)
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不须要显式地互相引用,从而使其耦合松散,并且能够独立地改变它们的交互。
2019年11月17日16:32:36