【设计模式】—— 中介者模式Mediator

  前言:【模式总览】——————————by xingoo

  模式意图

  使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。

  这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!

  应用场景

  1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式。

  2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时。

  3 想创造一个运行于多个类之间的对象,又不想生成新的子类时。

  模式结构

  

  Mediator 抽象的中介者,定义中介的规范

interface Mediator{
    public void colleagueChanged(Colleague c);
}

  ConcreteMediator 具体的中介者,通常内部依赖于多个业务对象

class ConcreteMediator implements Mediator{
    private Colleague1 col1;
    private Colleague2 col2;
    public void colleagueChanged(Colleague c) {
        col1.action();
        col2.action();
    }
    public void createConcreteMediator() {
        col1 = new Colleague1(this);
        col2 = new Colleague2(this);
    }
    private Colleague1 getCol1() {
        return col1;
    }
    public Colleague2 getCol2() {
        return col2;
    }
}

  Colleague 抽象的业务角色

abstract class Colleague{
    private Mediator mediator;
    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }
    public Mediator getMediator() {
        return mediator;
    }
    public abstract void action();
    public void change(){
        mediator.colleagueChanged(this);
    }
}

  Colleague1 Colleague2 具体的业务角色

class Colleague1 extends Colleague{
    public Colleague1(Mediator m){
        super(m);
    }
    public void action(){
        System.out.println("this is an action from Colleague1");
    }
}
class Colleague2 extends Colleague{
    public Colleague2(Mediator m){
        super(m);
    }
    public void action(){
        System.out.println("this is an action from Colleague2");
    }
}

  全部代码

 1 package com.xingoo.test.design.mediator;
 2 abstract class Colleague{
 3     private Mediator mediator;
 4
 5     public Colleague(Mediator mediator){
 6         this.mediator = mediator;
 7     }
 8
 9     public Mediator getMediator() {
10         return mediator;
11     }
12
13     public abstract void action();
14
15     public void change(){
16         mediator.colleagueChanged(this);
17     }
18 }
19 class Colleague1 extends Colleague{
20     public Colleague1(Mediator m){
21         super(m);
22     }
23     public void action(){
24         System.out.println("this is an action from Colleague1");
25     }
26 }
27 class Colleague2 extends Colleague{
28     public Colleague2(Mediator m){
29         super(m);
30     }
31     public void action(){
32         System.out.println("this is an action from Colleague2");
33     }
34 }
35 interface Mediator{
36     public void colleagueChanged(Colleague c);
37 }
38 class ConcreteMediator implements Mediator{
39     private Colleague1 col1;
40     private Colleague2 col2;
41
42     public void colleagueChanged(Colleague c) {
43         col1.action();
44         col2.action();
45     }
46
47     public void createConcreteMediator() {
48         col1 = new Colleague1(this);
49         col2 = new Colleague2(this);
50     }
51
52     private Colleague1 getCol1() {
53         return col1;
54     }
55
56     public Colleague2 getCol2() {
57         return col2;
58     }
59
60 }
61
62 public class Client {
63     public static void main(String[] args) {
64         ConcreteMediator mediator = new ConcreteMediator();
65         mediator.createConcreteMediator();
66         Colleague1 col1 = new Colleague1(mediator);
67 //        Colleague2 col2 = new Colleague2(mediator);
68         mediator.colleagueChanged(col1);
69     }
70 }

  运行结果

this is an action from Colleague1
this is an action from Colleague2

  生活中的设计模式

  

  毕业的同学们,第一个要解决的问题就是租房子,当白富美高富帅出没社会后,穷屌丝没了生存之地。但是只要勤劳,一样有饭吃有房住!

  这里房屋中介好比是一个中介者,它知道每个租客的身份信息,当有房屋出租后,它会发送给每一个租客消息。

  这样,租客们中有一个变化活动时,都会利用房屋中介,发送消息到其他的租客。下面就是模仿的一个过程。

  房屋中介代码如下:

 1 interface StateMediator{
 2     public void sell(Tenant tenant);
 3 }
 4 class RealEstateAgents implements StateMediator{
 5     private TenantA teA;
 6     private TenantB teB;
 7     private TenantC teC;
 8
 9     public void sell(Tenant tenant) {
10         System.out.println("海景洋房 已经租出去了!");
11         if(tenant instanceof TenantA){
12             teB.crying();
13             teC.crying();
14         }else if(tenant instanceof TenantB){
15             teA.crying();
16             teC.crying();
17         }else if(tenant instanceof TenantC){
18             teB.crying();
19             teA.crying();
20         }
21     }
22
23     public void createAgents(){
24         teA = new TenantA(this);
25         teB = new TenantB(this);
26         teC = new TenantC(this);
27     }
28 }

  租客的代码如下:

 1 abstract class Tenant{
 2     private RealEstateAgents agent;
 3     public Tenant(RealEstateAgents agent) {
 4         this.agent = agent;
 5     }
 6     public abstract void crying();
 7     public void renting(){
 8         agent.sell(this);
 9     }
10 }
11 class TenantA extends Tenant{
12     public TenantA(RealEstateAgents agent) {
13         super(agent);
14     }
15     public void crying() {
16         System.out.println("我是高富帅 TenantA!哎呀我想要!");
17     }
18 }
19 class TenantB extends Tenant{
20     public TenantB(RealEstateAgents agent) {
21         super(agent);
22     }
23     public void crying() {
24         System.out.println("我是白富美 TenantB!哎呀我想要!");
25     }
26 }
27 class TenantC extends Tenant{
28     public TenantC(RealEstateAgents agent) {
29         super(agent);
30     }
31     public void crying() {
32         System.out.println("我是穷屌丝 TenantC!哎呀我想要!");
33     }
34 }

  产生的业务活动如下:

 1 public class ClientTest {
 2     public static void main(String[] args) {
 3         RealEstateAgents agent = new RealEstateAgents();
 4         agent.createAgents();
 5
 6         System.out.println("TeA 抢到了房子了!");
 7         agent.sell(new TenantA(agent));
 8
 9         System.out.println("过了两个月 TeB 抢到了房子了!");
10         agent.sell(new TenantB(agent));
11     }
12 }

  运行结果

TeA 抢到了房子了!
海景洋房 已经租出去了!
我是白富美 TenantB!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!
过了两个月 TeB 抢到了房子了!
海景洋房 已经租出去了!
我是高富帅 TenantA!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!
时间: 2024-10-12 09:33:13

【设计模式】—— 中介者模式Mediator的相关文章

[设计模式] 中介者模式 Mediator Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 我们都知道,面向对象设计鼓励将行为分布到各个对象中.但是,这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象,就造成了复杂的关联关系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性.大量的相互连接使得一个对象似乎不太

23种设计模式--中介者模式-Mediator Pattern

一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

深入浅出设计模式——中介者模式(Mediator Pattern)

模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:? 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理.? 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱.? 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统

【C#设计模式-中介者模式】

一.概述:中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系.中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为. 二.例子:QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用. 三.结构: 者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色.抽象同事类和具体同事类.中介者类是起到协调各

7. 星际争霸之php设计模式--中介者模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248183.html============================================

JAVA 设计模式 中介者模式

用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结构 图-中介者模式结构图 Mediator : 为 Colleague 对象定义一个交流接口. abstract class Mediator {    public abstract void Send(String message, Colleague colleague);} Concrete

设计模式(行为型)之中介者模式(Mediator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)>http://blog.csdn.net/yanbober/article/details/45531395 概述 如果对象之间的联系呈现为网状结构,存在大量的多对多联系,在网状结

二十三种设计模式[17] - 中介者模式(Mediator Pattern)

前言 在开发软件的过程中,我们通常会将类设计的比较单纯,使其复用性更高.但类间的相互引用又使得类本身在没有其他类的支持下不能正常工作,导致其复用性降低.所以为了提高类的复用性我们需要尽可能的减少对其它类的引用,也就是说我们常说的解耦.中介者模式,顾名思义,就是存在一个类似中介的角色,类与类之间不直接交互而是通过中介进行间接的交互,也就意味着类与类之间不需要存在显示的引用,以达到松耦合的目的. 中介者模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为"