首页 > 其他分享 >设计模式之中介模式(三分钟学会一个设计模式)

设计模式之中介模式(三分钟学会一个设计模式)

时间:2024-09-24 19:02:09浏览次数:9  
标签:mediator void 三分钟 中介 unionPay msg 设计模式 com public

中介模式(Mediator)又称之为调停模式。
mediator [ˈmiːdieɪtə(r)]
n. 调停者;斡旋者;解决纷争的人(或机构); 本意就是解决纠纷的中间人
它是面向对象六大原则中最少知道原则的一个典型应用。
(关于面向对象六大原则,可看前文:https://www.cnblogs.com/jilodream/p/5353512.html)
大概意思就是类设计时与外界尽量减低耦合,尽量少的依赖其他类,这样就会降低类后期修改的风险。
官方的的定义如下:用一个中介对象来封装一系列的对象交互。中介对象使得其他各个对象不再需要显示的相互引用。使整体的耦合更加松散,而且可以改变独立的改变他们之间的交互。

它是面向对象的23种设计模式中的一种,属于行为模式的范围。
中介模式大概就是这样,比如你去买房,不论是价格讨论,还是房子质量,都通过中介来进行,尽管中介会包装一些逻辑,但是买家不需要管理所有卖家的信息,保留卖家的联系方式。卖家呢也不需要管理买家的信息,保留买家的联系方式。尽管是买卖房子,但是买家和卖家之间都是通过中介来进行交互,并不直接沟通。这样做的好处就是买卖双方都减轻了自己的工作负担,不需要牢记对方的相关特性,所有这些都交给中介来维护。
比如没有加入中介对象时,我们A/B 双方大概需要维护m*n依赖条,如果双方还要互相依赖,则是2*m*n条依赖,当A、B双方的实例越来越多时,情况也会越来越复杂。
当我们加入中介对象时,则只需要维护A/B和中介对象之间的依赖,约2(m+n)条依赖,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )

区别大概是下面这个样子

直接耦合

通过中介者组织

有些人会说AB 对象我就互相调用一下,需要搞这么复杂么?

如果只是简单调用,当然没必要引入中介类,当然是怎么简单怎么来,但是倘若业务未来(或者已经)依赖很复杂,就应该尽早引入中介类,降低类之间不必要的耦合。

来看一个例子,调用双方是
银行和企业,他们可以互相给对方发消息。我们通过中介模式来组织整体结构:

银行接口:

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 /**
 4  * @discription
 5  */
 6 public interface Bank {
 7     void sendMsg(String msg);
 8 
 9     void receiveMsg(String msg);
10 
11     void register(UnionPay unionPay);
12 }

工商银行实现

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class ICBCBank implements Bank {
10 
11     private UnionPay unionPay;
12 
13     @Override
14     public void sendMsg(String msg) {
15         log.warn("工商银行发送消息到企业:" + msg);
16         unionPay.sendCompany(msg);
17     }
18 
19     @Override
20     public void receiveMsg(String msg) {
21         log.warn("工商银行收到企业消息:" + msg);
22     }
23 
24     @Override
25     public void register(UnionPay unionPay) {
26         this.unionPay = unionPay;
27     }
28 }

建设银行实现

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class CCBBank implements Bank {
10 
11     private UnionPay unionPay;
12 
13     @Override
14     public void sendMsg(String msg) {
15         log.warn("建设银行发送消息到企业:" + msg);
16         unionPay.sendCompany(msg);
17     }
18 
19     @Override
20     public void receiveMsg(String msg) {
21         log.warn("建设银行收到企业消息:" + msg);
22     }
23 
24     @Override
25     public void register(UnionPay unionPay) {
26         this.unionPay = unionPay;
27     }
28 }

企业接口

1 package com.example.demo.learn.pattern.behavior.mediator;
2 
3 public interface Company {
4     void sendMsg(String msg);
5 
6     void receiveMsg(String msg);
7 
8     void register(UnionPay unionPay);
9 }

千度公司

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class QianDuCompany implements Company {
10     private UnionPay unionPay;
11 
12     @Override
13     public void sendMsg(String msg) {
14         log.warn("千度公司发送消息到银行:" + msg);
15         unionPay.sendBank(msg);
16     }
17 
18     @Override
19     public void receiveMsg(String msg) {
20         log.warn("千度公司收到银行消息:" + msg);
21     }
22 
23     @Override
24     public void register(UnionPay unionPay) {
25         this.unionPay = unionPay;
26     }
27 }

大米公司

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 
 5 /**
 6  * @discription
 7  */
 8 @Slf4j
 9 public class DaMiCompany implements Company {
10     private UnionPay unionPay;
11 
12     @Override
13     public void sendMsg(String msg) {
14         log.warn("大米公司发送消息到银行:" + msg);
15         unionPay.sendBank(msg);
16     }
17 
18     @Override
19     public void receiveMsg(String msg) {
20         log.warn("大米公司收到银行消息:" + msg);
21     }
22 
23     @Override
24     public void register(UnionPay unionPay) {
25         this.unionPay = unionPay;
26     }
27 }

中介类

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
 4 
 5 import java.util.List;
 6 
 7 /**
 8  * @discription
 9  */
10 public class UnionPay {
11     private List<Bank> bankList = Lists.newArrayList();
12 
13     private List<Company> companyList = Lists.newArrayList();
14 
15     public void register(Object... components) {
16         for (Object component : components) {
17             if (component instanceof Company) {
18                 Company company = (Company) component;
19                 companyList.add(company);
20                 company.register(this);
21             }
22             if (component instanceof Bank) {
23                 Bank bank = (Bank) component;
24                 bankList.add(bank);
25                 bank.register(this);
26             }
27         }
28     }
29 
30     public void sendBank(String msg) {
31         for (Bank bank : bankList) {
32             bank.receiveMsg(msg);
33         }
34     }
35 
36     public void sendCompany(String msg) {
37         for (Company company : companyList) {
38             company.receiveMsg(msg);
39         }
40     }
41 }

主类

 1 package com.example.demo.learn.pattern.behavior.mediator;
 2 
 3 /**
 4  * @discription
 5  */
 6 public class PatternMain {
 7     public static void main(String[] args) {
 8         Bank ccbBank = new CCBBank();
 9         Bank icbcBank = new ICBCBank();
10         Company qianDuCompany = new QianDuCompany();
11         Company daMiCompany = new DaMiCompany();
12         UnionPay unionPay = new UnionPay();
13         unionPay.register(ccbBank, icbcBank, qianDuCompany, daMiCompany);
14         ccbBank.sendMsg("欢迎各位企业来建设银行贷款!");
15         icbcBank.sendMsg("欢迎各位企业来工行洽谈合作!");
16         daMiCompany.sendMsg("哪家银行目前有低息企业贷款?");
17         daMiCompany.sendMsg("哪家银行目前有工资卡优惠活动?");
18     }
19 }

运行主类后,效果如下:

18:58:03.965 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行发送消息到企业:欢迎各位企业来建设银行贷款!
18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来建设银行贷款!
18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来建设银行贷款!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行发送消息到企业:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有工资卡优惠活动?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有工资卡优惠活动?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有工资卡优惠活动?

代码类图如下:

我们可以从类图发现,银行和企业并没有直接关联,他们都是直接耦合中介类,所有的请求和响应都是和中介类进行交互(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )

中介模式的优点是解耦:我们可以直接将第三方提供类进行组织,而不需要修改他们的代码。
缺点也很明显,业务依赖逻辑全部抽离到了中介类中,中介类会过于臃肿。

标签:mediator,void,三分钟,中介,unionPay,msg,设计模式,com,public
From: https://www.cnblogs.com/jilodream/p/18429808

相关文章

  • 设计模式之适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,它允许不兼容的接口之间进行交互。在软件工程中,适配器用于解决两个已有接口之间不匹配的问题,使得原本因接口不兼容而不能一起工作的类可以协同工作。基本概念目标接口(Target):客户期望使用的接口,它定义了客户需要的方法......
  • c#代码介绍23种设计模式_07适配器模式
    目录1、适配器模式2、类的适配器模式实现(ClassAdapterPattern.cs)3、对象的适配器模式实现(ObjectAdapterPattern.cs)4、适配器模式的优缺点4-1.类的适配器模式:4-2.对象的适配器模式5、使用场景6、.NET中适配器模式的实现7、实现思路1、适配器模式在实际的开发......
  • 云设计模式介绍
    云设计模式介绍以及它们如何帮助应对分布式计算的谬误   作为构建分布式系统的软件工程师,我们经常遇到诸如不可靠的网络、延迟问题和安全问题等挑战。"分布式计算的谬误"描述了如果未解决,可能导致系统故障的常见误解。但认识到这些陷阱只是开始。真正的问题是:我们如何有效地克......
  • Qt C++设计模式->组合模式
    组合模式(CompositePattern)是一种结构型设计模式,允许你将对象组合成树形结构以表示部分与整体的层次关系。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,简化了对复杂树形结构的操作。组合模式的应用场景组合模式非常适合用于需要处理树形结构的场景,比如文件系......
  • 设计模式总览
    设计模式总览三大类设计模式主要分为以下三大类:创建型模式(CreationalPatterns)单例(Singleton)模式原型(Prototype)模式工厂方法(FactoryMethod)模式抽象工厂(AbstractFactory)模式建造者(Builder)模式结构型模式(StructuralPatterns)代理(Proxy)模式适配器(Adapter)模式桥接(Bridge......
  • 软件设计模式-代理模式
    代理模式应用场景:1.静态代理:用户希望通过代理类的对象调用真实类的对象的方法,并且希望在调用真实类的对象之前,自定义进行某些操作。其实想要实现这样的操作有很多种方法,继承,装饰者模式都可以,但是静态代理考虑到只是调用真实类的对象的一个方法而已,没必要使用装饰者模式(将真实......
  • 设计模式之——装饰者模式
    前言:装饰者模式是结构性设计模式之一,其在不必改变类文件及不适用继承的情况下,动态的扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。一.定义动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。装饰者模式的结构图:装饰者模......
  • 软件设计模式-装饰者模式
    装饰模式应用场景:最基础用法:当需要对类A的对象添加一些自定义不同的方法时,直接在类A中添加方法不太好!那么需要一个类B继承类A,类B里面增加一个类A的对象作为自己的成员并自定义一个方法Bfunc,再重载类A中的某个方法func,在该方法里面调用自己的Bfunc。高级用法:假设要对男英雄和女......
  • c#代码介绍23种设计模式_03工厂模式
    目录1.工厂方法模式之所以可以解决简单工厂的模式2.使用工厂方法实现的系统,如果系统需要添加新产品时3.从UML图来看4、实现思路1.工厂方法模式之所以可以解决简单工厂的模式是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出......
  • LL学设计模式之最终章
    序学习过好多遍设计模式。感觉还是没学会。面试啥的又说不出来。这是最后一次了。忘了并不代表不会。知道个大概就行了为啥要学设计模式:1:阅读源代码的时候,知道是啥设计模式,就更容易看懂。2:为了写出好的容易扩展的代码。应对各种变化。简单。设计模式有指导原则。设计模式......