中介者模式

基本介绍

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

2.代码易于维护

3.应用场景:如 MVC 模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用

 

角色

1.Mediator:抽象中介者,定义了同事对象到中介者对象的接口

2.ConcreteMediator:具体中介者,实现 Mediator,需要知道所有 ConcreteColleague,以一个集合(HashMap)聚合 Colleague,并接受 ConcreteColleague 对象消息,完成相应的任务

3.Colleague:抽象同事类,聚合 Mediator

4.ConcreteColleague:具体同事类,ConcreteColleague 之间互相独立,调用 Mediator 相关方法,传入 ConcreteMediator 的集合

 

事项

1.优点

(1)将网状结构分离为星型结构,进行解耦,降低了类的复杂度

(2)符合迪米特原则,减少类间依赖,降低了耦合

2.缺点

(1)中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响

(2)如果设计不当,中介者对象本身变得过于复杂

3.应用场景

(1)系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象

(2)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类

 

操作流程

1.创建 ConcreMediator 对象

2.创建各个 ConcreteColleague 对象,并通过构造器加入到 ConcreMediator 的集合

3.ConcreteColleague 对象调用 sendMessage,去调用 ConcreteMediator 的 getMessage(核心)

4.getMessage 根据接收 ConcreteColleague  对象的消息,协调调用其它 ConcreteColleague  对象,完成任务

 

代码示例

import java.util.HashMap;
import java.util.Map;

public class Client {//客户端

    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);
        //同事1执行完操作1后,通过中介使同事2执行操作3
        concreteColleague1.operate1();
        //同事2执行完操作4后,通过中介使同事1执行操作2
        concreteColleague2.operate4();
    }
}

abstract class Mediator {//抽象中介者

    public abstract void registerColleague(Colleague colleague);//注册同事

    public abstract void getMessage(Integer state, String name);//接受并处理请求

    public abstract void sendMessage();//发送请求
}

class ConcreteMediator extends Mediator {//具体中介者
    private Map<String, Colleague> colleagues;

    public ConcreteMediator() {
        this.colleagues = new HashMap<>();
    }

    @Override
    public void registerColleague(Colleague colleague) {//注册同事
        colleagues.put(colleague.getClass().getSimpleName(), colleague);
    }

    @Override
    public void getMessage(Integer state, String colleagueName) {
        //根据name,在集合获取具体同事对象
        Colleague colleague = colleagues.get(colleagueName);
        //根据具体同事对象,进入对应的处理方法
        if (colleague instanceof ConcreteColleague1) {
            dealConcreteColleague1(state);
        } else if (colleague instanceof ConcreteColleague2) {
            dealConcreteColleague2(state);
        }
    }

    //根据state,判断ConcreteColleague请求,并处理
    private void dealConcreteColleague1(Integer state) {
        if (Integer.valueOf(0).equals(state)) {
            ((ConcreteColleague2) colleagues.get(ConcreteColleague2.class.getSimpleName())).operate3();
        }
    }

    private void dealConcreteColleague2(Integer state) {
        if (Integer.valueOf(0).equals(state)) {
            ((ConcreteColleague1) colleagues.get(ConcreteColleague1.class.getSimpleName())).operate2();
        }
    }

    @Override
    public void sendMessage() {
    }
}

abstract class Colleague {//抽象同事类
    private Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public void sendMessage(Integer state) {//发送请求
        mediator.getMessage(state, this.getClass().getSimpleName());
    }
}

class ConcreteColleague1 extends Colleague {//具体同事类1

    public ConcreteColleague1(Mediator mediator) {//将ConcreteColleague1传入ConcreteMediator的集合
        super(mediator);
        mediator.registerColleague(this);
    }

    public void operate1() {
        System.out.println("同事 1 执行 操作 1");
        sendMessage(0);
    }

    public void operate2() {
        System.out.println("同事 1 执行 操作 2");
    }
}

class ConcreteColleague2 extends Colleague {//具体同事类2

    public ConcreteColleague2(Mediator mediator) {//将ConcreteColleague2传入ConcreteMediator的集合
        super(mediator);
        mediator.registerColleague(this);
    }

    public void operate3() {
        System.out.println("同事 2 执行 操作 3");
    }

    public void operate4() {
        System.out.println("同事 2 执行 操作 4");
        sendMessage(0);
    }
}

 

posted @   半条咸鱼  阅读(31)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示