zoukankan      html  css  js  c++  java
  • 【设计模式】中介模式

    一、定义

      中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

    二、结构

    中介者模式的结构

    中介者模式包含以下主要角色。

      1)抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

      2)具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。 

      3)抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。 

      4)具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

    结构图

      

    三、代码实现

     1 public class Client {
     2     public static void main(String[] args) {
     3         ConcreteMediator mediator = new ConcreteMediator();
     4         Colleague colleague1 = new ConcreteColleague1();
     5         Colleague colleague2 = new ConcreteColleague2();
     6         mediator.register(colleague1);
     7         mediator.register(colleague2);
     8         colleague1.send();
     9         System.out.println("-------------");
    10         colleague2.send();
    11     }
    12 }
    13 // 抽象中介者
    14 abstract class Mediator {
    15     public abstract void register(Colleague colleague);
    16     // 转发
    17     public abstract void relay(Colleague cl);
    18 }
    19 // 具体中介者
    20 class ConcreteMediator extends Mediator {
    21     private List<Colleague> colleagues = new ArrayList<>();
    22     @Override
    23     public void register(Colleague colleague) {
    24         if(!colleagues.contains(colleague)) {
    25             colleagues.add(colleague);
    26             colleague.setMediator(this);
    27         }
    28     }
    29     @Override
    30     public void relay(Colleague cl) {
    31         for (Colleague c : colleagues) {
    32             if (!c.equals(cl)) {
    33                 c.receive();
    34             }
    35         }
    36     }
    37 }
    38 // 抽象同事类
    39 abstract class Colleague {
    40     protected Mediator mediator;
    41     public void setMediator(Mediator mediator){
    42         this.mediator = mediator;
    43     }
    44     public abstract void receive();
    45     public abstract void send();
    46 }
    47 // 具体同事类1
    48 class ConcreteColleague1 extends Colleague {
    49     @Override
    50     public void receive() {
    51         System.out.println("具体同事类1收到请求。");
    52     }
    53     @Override
    54     public void send() {
    55         System.out.println("具体同事类1发出请求。");
    56         mediator.relay(this); //请中介者转发
    57     }
    58 }
    59 // 具体同事类2
    60 class ConcreteColleague2 extends Colleague {
    61     @Override
    62     public void receive() {
    63         System.out.println("具体同事类2收到请求。");
    64     }
    65     @Override
    66     public void send() {
    67         System.out.println("具体同事类2发出请求。");
    68         mediator.relay(this); //请中介者转发
    69     }
    70 }
  • 相关阅读:
    mysql去重
    java 实现一套流程管理、流转的思路(伪工作流)
    js模块加载框架 sea.js学习笔记
    使用js命名空间进行模块式开发
    二叉树的基本操作实现(数据结构实验)
    学生信息管理系统-顺序表&&链表(数据结构第一次作业)
    计算表达式的值--顺序栈(数据结构第二次实验)
    使用seek()方法报错:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误的原因
    seek()方法的使用
    python中如何打印某月日历
  • 原文地址:https://www.cnblogs.com/h--d/p/14702475.html
Copyright © 2011-2022 走看看