Hi,我是十三,最近又把使命召唤的现代战争系列重看了一遍,剧情是真的赞,个人认为使命召唤 4、6、8 这三部曲实在是经典阿,还有荣誉勋章这款游戏也不错,青春阿…
前言
不知道有小伙伴是否也是枪械迷,推荐大家去 B 站搜索 Up 主哲学的石头,他的打法真的一路凶残到底,枪法意识都很好,看了他的视频再去看其他视频,感觉其他 Up 主的视频都没劲,当然对我而言是这样的,太厉害了。
好了,题外话就说到这里了,今天咱们继续来学习中介者设计模式,说到中介者十三第一个想到就是房产中介了,可是老是提房也是烦,主要是穷的一笔…好,那咱就换个婚姻中介,卧槽…你这真的是猝不及防。当然了,也不是什么都一上来就是找中介什么的,什么都得自己先试试。
public abstract class Person {
private String name;
private int condition;
public Person(String name, int condition) {
this.name = name;
this.condition = condition;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCondition() {
return condition;
}
public void setCondition(int condition) {
this.condition = condition;
}
public abstract void getPartner(Person person);
}
首先我们定义了个抽象 Person 类,它有字段属性及构造方法,还提供了个抽象的找对象方法…
public class Man extends Person {
public Man(String name, int condition) {
super(name, condition);
}
@Override
public void getPartner(Person person) {
if (person instanceof Man) {
System.out.println("Sorry,我不是Gay..");
} else {
if (this.getCondition() == person.getCondition()) {
System.out.println(this.getName() + "和" + person.getName() + "般配");
} else {
System.out.println(this.getName() + "和" + person.getName() + "无缘");
}
}
}
}
接着这个 Man 类继承自 Person 类,它实现了 Person 类里的抽象方法,在这个抽象方法里首先判断传入的 person 参数是否是 Man 实例,因为总不可能两个大老爷们在一起吧,当然你喜欢吧…接着再往下判断两人之间是否条件相等,这就好比于对方是不是对你有好感,考虑你条件够不够好等等,太复杂了这个,就不多说了。
public class Woman extends Person {
public Woman(String name, int condition) {
super(name, condition);
}
@Override
public void getPartner(Person person) {
if (person instanceof Woman) {
System.out.println("Sorry,我不是Gay..");
} else {
if (this.getCondition() == person.getCondition()) {
System.out.println(this.getName() + "和" + person.getName() + "般配");
} else {
System.out.println(this.getName() + "和" + person.getName() + "无缘");
}
}
}
}
既然有 Man 类,那肯定就有 Woman 类了,这里和上面是一样的,就不再多介绍了。
public class Client {
public static void main(String[] args) {
Person shisan = new Man("十三", 9);
Person p = new Man("路人乙", 10);
Person ll = new Woman("LL", 9);
shisan.getPartner(ll);
p.getPartner(ll);
p.getPartner(shisan);
}
}
// 运行结果:
十三和LL般配
路人乙和LL无缘
Sorry,我不是Gay..
好了,通过结果我们可以看到十三真幸运,他和 LL 牵手成功,而路人乙则悲催了点,但是不论结果是怎样,它们互相之间是认识的,这就要求对象之间需要其他对象,好比于十三如果不认识 LL 他最后怎么可能牵手成功呢。
站在我们开发中来讲,类与类之间的联系就比较紧密,对象之间的相互连接降低其可复用性,可能会使得一个对象在没有其他对象的支持下而罢工。迪米特原则中提到:如果两个类不必互相通信,那么这两个类就不应该发生直接的相互作用。好,那我们应该要怎么来做呢?
中介者模式 (Mediator)
中介者模式是行为模式之一,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
那么许多像路人乙那样被狠心拒绝,或者平时没有什么机会接触异性,那怎么办呢?于是,可能看到这个商机,各种婚姻中介强势崛起。通过这些中介对象,每个具体对象就不再同其他对象打交道了,而是通过这些中介者对象与另外一个对象发生相互作用。那么我们在上面例子的基础上再改写:
public abstract class Person2 {
private String name;
private int condition;
private Mediator mediator;
public Person2(String name, int condition, Mediator mediator) {
this.name = name;
this.condition = condition;
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCondition() {
return condition;
}
public void setCondition(int condition) {
this.condition = condition;
}
public abstract void getPartner(Person2 person);
}
这里我们这个抽象 Person 类,它增加对中介者 Mediator 的应用。
public class Man2 extends Person2 {
public Man2(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
}
@Override
public void getPartner(Person2 person) {
this.getMediator().setMan(this);
this.getMediator().getPartner(person);
}
}
public class Woman2 extends Person2 {
public Woman2(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
}
@Override
public void getPartner(Person2 person) {
this.getMediator().setWoman(this);
this.getMediator().getPartner(person);
}
}
这里就相当于两个具体的 Person 类,分别实现了抽象找对象方法,但是这里找对象可是通过中介介绍找的对象,这个过程我们可以这样理解,因为抽象父类 Person 持有中介者 Mediator 类的引用,所以我们这里的 getPartner 找对象方法,先是通过父类找到当前这个中介,然后注册相关会员信息,注册好后中介就会帮我们找对象了,当我们调用找对象的方法,实际上是中介者帮我们找的对象,那么下面我来看看这个中介者类:
public class Mediator {
private Man2 man;
private Woman2 woman;
public void setMan(Man2 man) {
this.man = man;
}
public void setWoman(Woman2 woman) {
this.woman = woman;
}
public void getPartner(Person2 person) {
if (person instanceof Man2) {
this.setMan((Man2) person);
} else {
this.setWoman((Woman2) person);
}
if (man.getCondition() == woman.getCondition()) {
System.out.println(man.getName() + "和" + woman.getName() + "般配");
} else {
System.out.println(man.getName() + "和" + woman.getName() + "无缘");
}
}
}
我们可以看到这个中介者类它持有对具体对象的引用,这个很好理解,就相当于你要我帮你找对象,你得要把你相关信息告诉我,我好给你找对吧。再之后中介就会帮我们筛选出合适的对象,就会通知我们出来见个面?
public class Client {
public static void main(String[] args) {
Mediator mediator = new Mediator();
Person2 man = new Man2("路人乙", 3, mediator);
Person2 woMan = new Woman2("小芳", 3, mediator);
man.getPartner(woMan);
}
}
//运行结果:
路人乙和小芳般配
这样,路人乙就通过中介找到他的真爱,祝福他们。我们回过头来看下,相比于我们第一次的写法,路人乙和小芳它们本来之间就是不认识的,就类似于两个人类之间可以不用进行通信。但是它们都通过中介认识接触到对方,这样的话,我们的类与类之间就不需要知道其他对象了,只需要和中介者打交道就可以了。
总结
最后我们来简单总结下。
中介者的出现减少了各个类之间的耦合,明确类之间的相互关系;中介者模式将原来相互依存的多对多的类关系简化为中介者类与其他关联类一对多的关系,当其中一个类修改时也不影响其他关联类。
后来,据路人乙说其实那天下午他去和中介介绍的女孩见面了,等他到场时才发现对方是个男的?一问才知道,对方也是被安排出来见面的,只是没想对方竟然是个男的,没过多一会儿,原来是中介搞错了…因为生意太过于火爆,这将使得中介者会变得相当复杂繁忙。
这都不是重点,重点是路人乙发现对方竟然也是程序员,哈哈,这下可好,两人一见如故,那天他们整整聊了一下午的技术,走时,他们还互相交换了微信…
更好的阅读体验请移步到【十三的个人博客】:https://binshao.site/