ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java设计模式--中介者模式

2019-08-05 22:05:01  阅读:252  来源: 互联网

标签:java mediator 对象 ConcreteColleague1 ConcreteColleague2 中介 设计模式 public


中介者模式

  中介者模式是设计模式中的对象行为型模式,主要是通过一个中介对象来封装一系列对象的交互,这样使得各需要交互的对象不需要显示的互相引用,从而使得各对象的耦合松散,并且可以独立的改变他们的交互。

  在面向对象的设计中,通常会把不同的行为分布到不同的对象中去,这样的设计就可以会导致每个对应都有其他对象的引用,也可以显式的调用其他各对象,那么如果我修改一个对象的行为,可能就会涉及到其他所有对象的修改,这样大大增加了工作量,不利于系统的维护。

中介者模式的适用性

  • 系统中各对象存在复杂的引用关系,且整体结构混乱难以维护的情况下。

  • 一个对象同时会引用其他很多个对象,导致该对象难以复用的情况下。

  • 想通过一个中间类来封装其他多个类的行为,同时又不想生成很多个子类的情况下。

中介者模式的结构图

中介者模式一共包含4类角色:

1、抽象中介者角色(Mediator):抽象中介者定义一个接口,该接口用于提供个对象之间的通信。

2、具体中介者角色(ConcreteMediator):具体中介者实现抽象中介者定义的接口,并且保存需要该对象进行中介通信的各对象实例。

3、抽象同事角色(Colleague):保存对中介者对象的引用。

4、具体同事角色(ConcreteColleague):保存对中介者对象的引用,同时在需要与其他对象通信的时候,通过与中介者对象通信来完成。

 

中介者模式的示例

  抽象中介者角色,定义统一的接口,方便各同事对象的通信

 

public interface Mediator {
    public void send(String message, Colleague colleague, String receiver);
}

 

  具体中介者角色,通过协调各同事角色的行为,同事包含各同事角色的引用,同时定义各同事类之间相互通信的逻辑,避免通信混乱。

public class ConcreteMediator implements Mediator {
    private ConcreteColleague1 concreteColleague1;
    private ConcreteColleague2 concreteColleague2;

    public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
        this.concreteColleague1 = concreteColleague1;
    }

    public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
        this.concreteColleague2 = concreteColleague2;
    }

    @Override
    public void send(String message, Colleague colleague, String receiver) {
        if (colleague == concreteColleague1) {
            if (receiver.equals("ConcreteColleague2")) {
                System.out.println("ConcreteColleague1给" + receiver + "发送消息" + message);
            }
        } else if (colleague == concreteColleague2) {
            if (receiver.equals("ConcreteColleague1")) {
                System.out.println("ConcreteColleague2给" + receiver + "发送消息" + message);
            }
        }
    }
}

  抽象同事角色

public abstract class Colleague {
    protected Mediator mediator;

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

  具体同事角色,即系统内需要相互通信的各对象

public class ConcreteColleague1 extends Colleague {

    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    public void sendtoColleague2(){
        String message="同事类1发送消息";
        mediator.send(message,this,"ConcreteColleague2");
    }
}
public class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    public void sendtoColleague2(){
        String message="同事类2发送消息";
        mediator.send(message,this,"ConcreteColleague1");
    }
}

  客户端演示

public class Client {
    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();
        ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
        ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);
        concreteMediator.setConcreteColleague1(concreteColleague1);
        concreteMediator.setConcreteColleague2(concreteColleague2);
        concreteColleague1.sendtoColleague2();
        concreteColleague2.sendtoColleague2();
    }
}

/*
执行结果:
        ConcreteColleague1给ConcreteColleague2发送消息同事类1发送消息
        ConcreteColleague2给ConcreteColleague1发送消息同事类2发送消息
        */

  从以上示例中,可以看出各同事角色不再需要拥有需要通信对象的引用,降低了系统的耦合度,所有的通信逻辑都在中介者对象中完成,但是可以想象得到,如果一个通信系统中包含了许多个通信对象,那么中介者对象势必会非常复杂。所以在考虑使用中介者模式的时候虽然会简化通信对象的引用,但是也需要考虑中介者对象膨胀的问题。

 

标签:java,mediator,对象,ConcreteColleague1,ConcreteColleague2,中介,设计模式,public
来源: https://www.cnblogs.com/rhodesis/p/11305767.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有