admin管理员组文章数量:1621918
2019独角兽企业重金招聘Python工程师标准>>>
中介者模式
中介者模式(Mediator Pattern)又称为调停者模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,中介者通常处理不同对象之间的通信,使各对象不需要显式地相互引用,从而耦合松散,使代码易于维护。中介者模式属于行为型模式。
什么是中介者模式?
顾名思义,和中介有关。在我们日常生活中,也和中介有着各种各样的联系。比如买房,买车,出国留学,旅游等等。通过直接和中介接触,省去了我们很多麻烦,也提高了办事的效率。
以现实生活中打牌的例子来实现下中介者模式。打牌总有输赢,对应的则是货币的变化,如果不用中介者模式的话,实现如下:
创建对象抽象类:
package com.design_pattern.mediator_pattern;
/**
*
* 抽象对象 这里指抽象的打牌牌友
*
*/
public abstract class AbstractCardPartner {
public int Money;
public abstract void ChangeMoney(int money, AbstractMediator mediator);
}
创建具体角色实现类:
package com.design_pattern.mediator_pattern;
/**
*
* 具体的牌友A
*
*/
public class PartnerA extends AbstractCardPartner {
@Override
public void ChangeMoney(int money, AbstractMediator mediator) {
mediator.AWin(money);
}
}
package com.design_pattern.mediator_pattern;
public class PartnerB extends AbstractCardPartner {
@Override
public void ChangeMoney(int money, AbstractMediator mediator) {
mediator.BWin(money);
}
}
创建中介者抽象类:
package com.design_pattern.mediator_pattern;
/**
*
* 抽象中介者类
*
*/
public abstract class AbstractMediator {
protected AbstractCardPartner A;
protected AbstractCardPartner B;
public AbstractMediator(AbstractCardPartner a, AbstractCardPartner b) {
A = a;
B = b;
}
public abstract void AWin(int money);
public abstract void BWin(int money);
}
创建中介者具体实现类
package com.design_pattern.mediator_pattern;
/**
* 具体中介者
*
*/
public class MediatorPater extends AbstractMediator {
public MediatorPater(AbstractCardPartner a, AbstractCardPartner b) {
super(a, b);
}
@Override
public void AWin(int money) {
A.Money += money;
B.Money -= money;
}
@Override
public void BWin(int money) {
B.Money += money;
A.Money -= money;
}
}
创建使用者:
package com.design_pattern.mediator_pattern;
public class Main {
public static void main(String[] args) {
AbstractCardPartner A = new PartnerA();
AbstractCardPartner B = new PartnerB();
A.Money = 20;
B.Money = 20;
AbstractMediator mediator = new MediatorPater(A, B);
// A赢了
A.ChangeMoney(5, mediator);
System.out.println("A赢了5元---" + A.Money + ": " + B.Money);
// B赢了
B.ChangeMoney(10, mediator);
System.out.println("B赢了10元---" + A.Money + ": " + B.Money);
}
}
输出结果:
A赢了5元---25: 15
B赢了10元---15: 25
从上面的例子可以看出,中介者类,持有所有需要互相通信的对象。并且需要互相通信的对象,在彼此进行交互,更改彼此状态的时候,没有直接互相调用,而是都持有一个中介者类对象,调用了中介者的方法,由中介者执行对象状态的变更。
在上面的实现代码中,抽象中介者类保存了两个抽象牌友类,如果新添加一个牌友类似时,此时就不得不去更改这个抽象中介者类。可以结合观察者模式来解决这个问题,即抽象中介者对象保存抽象牌友的类别,然后添加Register和UnRegister方法来对该列表进行管理,然后在具体中介者类中修改AWin和BWin方法,遍历列表,改变自己和其他牌友的钱数。这样的设计还是存在一个问题——即增加一个新牌友时,此时虽然解决了抽象中介者类不需要修改的问题,但此时还是不得不去修改具体中介者类,即添加CWin方法,我们可以采用状态模式来解决这个问题,关于状态模式的介绍将会在下一篇进行介绍。
中介者模式的优缺点
优点:
- 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
- 提供系统的灵活性,使得各个同事对象独立而易于复用。
缺点:
- 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
- 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
中介者模式的适用场景
以下情况下可以考虑使用中介者模式:
- 一组定义良好的对象,现在要进行复杂的相互通信。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
转载于:https://my.oschina/xiaoyoung/blog/2995115
版权声明:本文标题:设计模式的学习(13)中介者模式 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1728851658a1176746.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论