最近学习到设计模式,现总结个人学习中介者模式内容【注重的是通过一个中间类来封装多个类的行为】。
上一篇:Java设计模式-观察者模式
定义
用一个中介对象来封装一系列的对象交互,减少各个对象之间显示的互相引用从而松耦合。
优缺点
优点
- 减少类间依赖,降低了耦合
缺点
- 中介者会膨胀的很大,而且逻辑复杂
实现
中介者模式角色
- Mediator是抽象中介者,定义了同事对象到中介者对象的接口;
- ConcreteMediator【这里的CompanyMediator】是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令,中介者承担全部的业务逻辑,容易崩溃。
- Colleague【这里的Company 】是抽象同事类;
- ConcreteColleague【这里的AlipayCompany 、QQCompany 】是具体同事类,每个具体同事只知道自己的行为,而不了解其它同事类的情况,但它们却都认识中介者对象。
代码
中介抽象类以及具体中介类
/** 中介模式抽象者
* @author cc百川
*/
public abstract class Mediator {
//将给中介者对象,加入到集合中
public abstract void registerObj(String objName, Company obj);
//广发消息
public abstract void sendMessage(int stateChange, String objName);
}
/**
具体中介者,面临信息膨胀难以维护
* RecruitMediator是具体中介者对象,
* 实现抽象类的方法,它需要知道所有具体公司类,
* 并从具体公司接收消息,向具体公司对象发出命令;
* @author cc百川
*
*/
class CompanyMediator extends Mediator{
//封装数据
static HashMap<String, Company> companys = new HashMap<>();;
@Override
public void registerObj(String objName, Company obj) {
companys.put(objName , obj);
}
/**
* 中介公司发布公司发布的相关信息
*/
@Override
public void sendMessage(int stateChange, String objName) {
for(Map.Entry<String, Company> commap: companys.entrySet()){
if(objName.equals(commap.getKey())) continue;
Company com = commap.getValue();
if(stateChange == 0) {//开启
com.openRecruit(objName);
} else {//关闭
com.closeRecruit(objName);
}
}
}
}
公司抽象类以及具体公司
/** 公司抽象接口
* @author cc百川
*/
public abstract class Company {
protected Mediator mediator;//中介抽象类
protected String compName;//公司名称
public Company(Mediator mediator, String compName) {
this.mediator = mediator; this.compName = compName;
}
//发送招聘信息
public void sendRecruit(int recruitType){
this.mediator.sendMessage(recruitType, this.compName);
};
//开启招聘
protected void openRecruit(String objname) {println(objname,"我发布了招聘信息");}
//关闭招聘
protected void closeRecruit(String objname) {println(objname, "我已经停止了招聘");}
public void println(String obj, String msg){
System.out.println( "《"+this.compName+"》收到了来自《"+obj+"》的消息="+msg);
};
}
//支付宝
class AlipayCompany extends Company{
public AlipayCompany(Mediator mediator, String compName) {
super(mediator, compName);
mediator.registerObj(compName, this);
}
}
//腾讯qq
class QQCompany extends Company{
public QQCompany(Mediator mediator, String compName) {
super(mediator, compName);
mediator.registerObj(compName, this);
}
}
测试
public class Test {
public static void main(String[] args) {
Mediator mediator = new CompanyMediator();
AlipayCompany ali = new AlipayCompany(mediator, "支付宝");
QQCompany qq = new QQCompany(mediator, "腾讯QQ");
ali.sendRecruit(0);
qq.sendRecruit(0);
ali.sendRecruit(1);
}
}
中介者模式重点在于,通过一个中间类来封装多个类的行为,而又不想生成太多的子类
以上仅为个人学习,如果错误望指出,谢谢。