中介者模式

中介者模式介绍

用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互

中介者模式的核心:

  • 就是将网状结构处理成星型结构
  • 将多对多处理成一对多

例如:国家跟国家之间的交流 可以通过联合国这么一个中介对象来维护管理

模式结构图

image

该模式的四大主角

Colleague(抽象同事类)

ConcreteColleague(具体同事类)

Mediator(抽象中介者)

ConcreteMediator(具体中介者对象)


Colleague(抽象同事类)

ConcreteColleague(具体同事类)

中介者模式的适用场景:

一组定义良好的对象,现在要进行复杂的相互通信。
想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

优点:

简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。

提供系统的灵活性,使得各个同事对象独立而易于复用。

缺点:

中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。例如,QQ游戏中计算欢乐豆的程序出错了,这样会造成重大的影响。

//抽象中介者
public interface Mediator {
    void register(String dname,Department d);//将具体的同事类注册到中介者中,让中介者知道所有的同事。以便进行交互
    void command(String dname);//通过部门名称,发出命令
}

//抽象同事类:部门
public interface Department {
    void selfAction();//做本部门的事
    void outAction();//向总经理发出申请
}

//具体同事类:研发部
public class Development implements Department{
    private Mediator m;//中介者(总经理)
    //构造的时候将中介者构造进来
    public Development(Mediator m) {
        super();
        this.m = m;
        //ConcreteMediator(具体中介者对象):实现抽象中介者的方法
        //它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
        m.register("development", this);//将当前部门对象注册到中介者对象中,
    }
    @Override
    public void selfAction() {
        System.out.println("研发部:正在研发项目......");
    }
    @Override
    public void outAction() {
        System.out.println("研发部向总经理说:项目经费没了.....");
    }
}


//具体同事类:财务部
public class Finacial implements Department{
    private Mediator m;//中介者(总经理)
    //构造的时候将中介者构造进来
    public Finacial(Mediator m) {
        super();
        this.m = m;
        //ConcreteMediator(具体中介者对象):实现抽象中介者的方法
        //它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
        m.register("finacial", this);//将当前部门对象注册到中介者对象中,
    }
    @Override
    public void selfAction() {
        System.out.println("财务部:会计正在核对财务......");
    }
    @Override
    public void outAction() {
        System.out.println("财务部向总经理说:钱很多,花不完.....");
    }
}


//具体同事类:市场部
public class Market implements Department{
    private Mediator m;//中介者(总经理)
    //构造的时候将中介者构造进来
    public Market(Mediator m) {
        super();
        this.m = m;
        //ConcreteMediator(具体中介者对象):实现抽象中介者的方法
        //它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
        m.register("market", this);//将当前部门对象注册到中介者对象中,
    }
    @Override
    public void selfAction() {
        System.out.println("市场部:正在跑市场......");
    }
    @Override
    public void outAction() {
        System.out.println("市场部向总经理说:合同已搞定,需财务部报销.....");
        m.command("finacial");//通过总经理这个中介,向总经理发出申请,告知需要跟财务部交互报销经费
    }
}


//中介者的具体实现:总经理
public class President implements Mediator{
    //总经理也需要知道所有具体同事类
    private Map<String,Department> map = new HashMap<String,Department>();
    @Override
    public void register(String dname, Department d) {
        map.put(dname, d);//将同事注册到总经理的所有同事类容器中
    }
    @Override
    public void command(String dname) {
        map.get(dname).selfAction();//根据部门名称向具体的部门下命令
    }
}

public static void main(String[] args) {
    Mediator m = new President();//构建中介者对象:总经理
    Market market = new Market(m);//构建市场部
    market.selfAction();
    market.outAction();//市场部和财务部交互
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
终端终结者是一个在Ubuntu上使用的终端模拟器。您可以按照以下步骤来安装和使用终端终结者: 1. 打开终端(按下Ctrl+Alt+T)。 2. 运行以下命令来安装终端终结者:sudo apt-get install terminator 3. 安装完成后,您可以通过在应用程序菜单中搜索“终端终结者”或在终端中运行“terminator”命令来打开它。 4. 一旦打开终端终结者,您可以右键单击终端窗口,并选择“水平”或“垂直”方向来扩展一个新的终端。这样,您就可以在一个窗口中同时操作多个终端。 如果遇到终端终结者无响应的问题,可能是由于系统默认的Python版本设置为Python 3导致的。这时您可以按照以下方法解决: 1. 打开终端终结者的启动文件。您可以通过运行以下命令来找到启动文件的位置:which terminator 2. 打开启动文件并进行编辑。例如,如果启动文件是“/usr/bin/terminator”,则可以运行以下命令来编辑它:sudo nano /usr/bin/terminator 3. 在打开的文件中,找到以“#!/usr/bin/python”开头的一行,并将其修改为“#!/usr/bin/python2”。 4. 保存并关闭文件。 5. 再次尝试运行终端终结者,应该可以正常启动了。 希望这些信息能够帮助您解决问题。如果您有任何其他相关问题,请随时提问。 相关问题: 1. 如何卸载终端终结者? 2. 如何在终端终结者中创建自定义布局? 3. 如何在终端终结者中设置快捷键?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值