跟着老侯玩编程 跟着老侯玩编程
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
首页
  • 基础语法
  • 设计模式
  • 基础语法
  • 课程目录
  • 码农宝典
网盘 (opens new window)
留言
  • 基础语法

    • 单元文件
    • 变量和常量
    • 内联变量
    • 基本数据类型
    • 复合数据类型
    • 语句(选择语句)
    • 语句(循环语句)
    • 数组
    • 初识例程
    • 初识面向对象
    • 属性Property
    • 面向对象的方法
    • 指针
    • 接口
    • 匿名函数和委托实现
    • 多态
    • 字符串详解
    • 异常处理
    • 反射机制
    • 泛型容器
    • JSON
    • 文件操作
    • Dll创建并调用
    • DLL初始化和退出处理
    • Package
    • 理解消息循环
    • VCL与Windows消息
    • 钩子原理
    • 进程通讯-内存映像
    • 多线程开篇
    • 线程控制
    • 线程同步
  • 设计模式

    • 单例模式
    • 单例模式二
    • 策略模式
    • 简单工厂模式
    • 建造者模式
    • 原型模式
    • 模板方法模式
    • 状态模式
    • 迭代器模式
    • 解释器模式
    • 责任链模式
    • 中介者模式
      • 应用场景
      • 案例代码
      • 小结
    • 备忘录模式
    • 命令模式
    • 观察者模式
    • 访问者模式
    • 适配器模式
    • 桥接模式
  • Delphi
  • 设计模式
舞动的代码
2022-04-29

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

引自菜鸟教程:https://www.runoob.com/design-pattern/mediator-pattern.html

可能从上面的描述中还是无法理解中介者模式的具体作用,一图胜千言(图是网上找的)

第一种情况下对象之间的交互是属于一个网状的结构,在第二张引入中介者模式之后由原来的网状变为了中心型。这种方式的优点如下

  • 降低了类的复杂度,将一对多转化成了一对一

  • 各个类之间的保持松散耦合

当然缺点也非常明显,当我们将所有的关系处理封装在了中介者类中,那么就会导致中介者庞大,变得复杂难以维护。

# 应用场景

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

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

# 案例代码

在查找资料的时候在一个博客上看到个非常不错的案例,看代码好像是C#。但是不重要,知道了思路我们就可以动手书写Delphi代码了

博客地址:https://www.cnblogs.com/hulizhong/p/11655641.html

program MediatorPattern;

{$APPTYPE CONSOLE}
{$R *.res}

{ 中介者模式 }
uses
    System.SysUtils;

type

    // 抽象房东及房子信息
    TColleague = class abstract
    public
        // 基本的信息展示
        procedure Handle(); virtual; abstract;
    end;

    // 定义具体的房屋类型,小房间
    TSmallHouseColleague = class(TColleague)

    public
        procedure Handle(); override;
    end;

    // 两居室
    TTwoHouseColleague = class(TColleague)
    public
        procedure Handle(); override;
    end;

    // 抽象中介者,可以是任意类型的中介
    TMediator = class abstract

    public
        { 定义沟通方式 }
        procedure Common(HouseType: Integer); virtual; abstract;
    end;

    // 定义中介者的具体实现
    THouseMediator = class(TMediator)
        // 中介中登记的房屋信息
    private
        FSmallHouseColleague: TSmallHouseColleague;
        FTwoHouseColleague: TTwoHouseColleague;
    public
        property SmallHouseColleague: TSmallHouseColleague read FSmallHouseColleague write FSmallHouseColleague;
        property TwoHouseColleague: TTwoHouseColleague read FTwoHouseColleague write FTwoHouseColleague;

        // 重写父类方法
        procedure Common(HouseType: Integer); override;
    end;

    { TSmallHouseColleague }

procedure TSmallHouseColleague.Handle;
begin
    Writeln('小房间展示');
end;

{ TTwoHouseColleague }

procedure TTwoHouseColleague.Handle;
begin
    Writeln('两居室房间展示');
end;

{ THouseMediator }

procedure THouseMediator.Common(HouseType: Integer);
begin
    case HouseType of
        1: begin
                SmallHouseColleague.Handle;
            end;
        2: begin
                TwoHouseColleague.Handle;
            end;
    else Writeln('没有符合需求的房屋');
    end;
end;

begin
    try
        // 创建中介对象
        var
        HouseMediator := THouseMediator.Create;
        // 登记房屋信息
        HouseMediator.SmallHouseColleague := TSmallHouseColleague.Create;
        HouseMediator.TwoHouseColleague := TTwoHouseColleague.Create;
        // 小黑要租房
        HouseMediator.Common(1);
        readln;
    except
        on E: Exception do Writeln(E.ClassName, ': ', E.Message);
    end;

end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

# 小结

设计模式看似无用,其实很重要。以今天介绍的中介者模式为例,Java 微服务开发中的注册中心功能正是借助这一模式加以完善和实现的。设计模式虽好但是不能滥用

上次更新: 2022/05/05, 14:24:28
责任链模式
备忘录模式

← 责任链模式 备忘录模式→

Theme by Vdoing | Copyright © 2013-2022 冀ICP备16006233号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×