伪中介模式(5.5)

中介模式(mediator pattern)是一种“平台式”或“管家式”委派方式。

中介模式中,中介是各个希望相互交互的参与者的共同且唯一代理,它完成消息的转发或处理。

平台式中介

现实生活中有集市、股票交易所、婚姻介绍所、房屋中介等形形色色的中介(mediator)组织,它们有效地将参与者(participator)的两两交互转化为参与者与中介的交互。但是,这些中介正好是GoF中介模式的错误例子。网上有许多人用QQ为例引入中介模式,显然没有从代码的角度分析,纯属想当然

这里说一个现实的场景。一场Party,有男生/Boy、女生/Girl参加,每个人都可以与其他对象交互。请问,实现这一场景的代码有多复杂?只有当你真正写出代码时,你会发现10万个对象的彼此交谈,也不过两个类的代码要写。

例程 5 9 不需要中介
package delegate.mediator.party;
public abstract class Actor{
    String name;
    public abstract void send(String message,Actor to);
    public abstract void receive(String message,Actor from);
}
package delegate.mediator.party;
import static tool.Print.*;
public class Boy extends Actor{
    private int count;
    public Boy(String name){
        this.name =name;
    }
    @Override public void send(String message,Actor to){
        pln(this.name+" To "+to.name+":\""+message+"\"");
        to.receive(message,this);
    }
    @Override public void receive(String message,Actor from){
        char c = (char)(Math.random()*4+'a');
        if(c!='b'){
            String msg = message+" "+c;
            send(msg,from);
        }
    }
}
package delegate.mediator.party;
public class Party{
    public static void main(){
        Actor[] alist = new Actor[]{
                new Boy("B1"),new Boy("B2"),new Boy("B3"),new Boy("B4"),
                 new Girl("G1"),new Girl("G2"),new Girl("G3")
            };
        for(int i=0;i<alist.length;i++){
            int rand= (int)(Math.random()*alist.length);
            alist[i].send("hi",alist[rand]);
        }
    }
}

测试代码中,每一个Party参与者发起一次对话,对话的对象是随机的。对话的内容为随机字符,对话必须持续直到随机字符为b(bay)才结束。某一次运行结果(”//结束“不是程序的输出):

B1 To B4:"hi"

B4 To B1:"hi d"

B1 To B4:"hi d d"

B4 To B1:"hi d d a"

B1 To B4:"hi d d a a" //结束

B2 To B3:"hi" //结束

B3 To G2:"hi"//结束

B4 To B1:"hi"//结束

G1 To G2:[hi]

G2 To G1:[hi d]

G1 To G2:[hi d d]

G2 To G1:[hi d d d]

G1 To G2:[hi d d d a]

G2 To G1:[hi d d d a d]

G1 To G2:[hi d d d a d c]

G2 To G1:[hi d d d a d c a]

G1 To G2:[hi d d d a d c a a]

G2 To G1:[hi d d d a d c a a a]

G1 To G2:[hi d d d a d c a a a a]

G2 To G1:[hi d d d a d c a a a a c] //居然聊了这么多 //结束

G2 To B2:[hi]

B2 To G2:"hi c"

G2 To B2:[hi c a]

B2 To G2:"hi c a a"

G2 To B2:[hi c a a a]

B2 To G2:"hi c a a a c"

G2 To B2:[hi c a a a c a]

G3 To G1:[hi]

在讨论中介模式时,许多人看到对象的交互呈现网状结构,几乎每个对象都需要与其他对象发生相互作用。[GoF]中介者模式:“定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互”。事实上,上述代码告诉了一个事实,这里不需要中介模式:

①各对象之间并不需要“显式”持有彼此的引用。Boy和Girl是Actor的子类,即使Party中出现了Boy和Girl等具体类型,Boy和Girl的类体中依赖Actor即可。②多个类(Boy、Girl)的大量对象的交互,并不一定会导致类之间的过度耦合。Boy和Girl之间就不存在任何耦合。类似的,让家长、老师等参加Party,只要他们是Actor,彼此之间不存在任何耦合。

所以,上面的例子并不是我们需要中介(这里不是中介模式)的原因。

然而,如果有一个对象需要找一个女朋友,他一个个地与每一个Girl对象交互,就显得非常低效和不现实。此时,他需要一个能够广播的“平台”。平台式的中介中,不管参与者如何形形色色,中介的作用如同一个公告牌。所以非常容易地联想到观察者模式,事实上,作为公告牌的“中介模式”就是观察者模式

于是,由于中介者Party现在作为交互平台,它被所有感兴趣的参与者观察!再次不同于[GoF]中介者模式。[GoF]中,它写道“将Mediator实现为一个观察者,各Colleague作为Subject”。而此时,我们的代码是:Mediator实现为一个Subject,各Colleague作为Observer。

这一“平台式中介的代码,网上随处可见。

对象和类

[GoF]中介者模式:“定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散..."

这也给我们带来一个问题:这里的”对象“是什么东西?

在Java等面向对象的语言中,yqj2065一直强调:类是第一性的。程序员编程针对的都是类而非对象。事实上,[GoF]的中介者模式——“管家式”委派方式中,才体现了一个类(的对象)发生状态改变,将导致许多其他类(的对象)发生相应的变化。和股票交易所、婚姻介绍所等不同,后者虽然参与者有诸多对象,真正的类不多而且交互简单。

有人说了:Party中有的男女对上眼了,会一直聊到Party结束;有的男生可以一直聊篮球;有的女生只和女生聊,有的女生只和名字好听的人聊……你怎么处理这些对象?

还是一句话:我将处理的不是对象而是类——匿名类!你可以用匿名类或λ表达式为客户留下无限的扩展空间。

总之,股票交易所、婚姻介绍所、聊天室的例子,都不是[GoF]中介者模式

时间: 2024-08-02 11:03:24

伪中介模式(5.5)的相关文章

php中的设计模式之--中介模式

<?php /* 中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式, 使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时, 不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立的变化. 定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. 主要角色 ? 中介者(Mediator)角色:定义了对象间相互作用的接口(房产中介) ? 具体中介者(ConcreteMe

21中介模式

 1中介模式的核心内容是: A:通过中间这向多方发送消息 2中介模式的作用:通过中介模式模式中介对两个互不通信的部分进行发通知. 3中介模式具体描述 MEDIATOR调停者模式 调停者模式:调停者模式包装了一系列对象相互作用的方式, 使得这些对象不必相互明显作用.从而使他们可以松散偶合. 当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用. 保证这些作用可以彼此独立的变化.调停者模式将多对多的相互作用转化 为一对多的相互作用.调停者模式将对象的行为和协作抽象化 ,把对象在小

在RHEL 6.5上部署Hadoop 2.6伪分布式模式(单机)

第一步:安装JAVA 1.7               此步骤略过,太简单了,可参考这个: http://blog.sina.com.cn/s/blog_6a7cdcd40101b1j6.html   第二步:创建Haddop专用用户             虽然使用root用户也可以部署hadoop,但从系统安全及规范的角度考虑,还是建议大家创建专用的用户(本例中为hadoop,实际中可以是任意用户名),创建用户的命令: # useradd hadoop # passwd hadoop   

伪分布式模式的Hadoop环境搭建

一.本文说明:     本次测试在一台虚拟机系统上进行伪分布式搭建.Hadoop伪分布式模式是在单机上模拟Hadoop分布式,单机上的分布式并不是真正的伪分布式,而是使 用线程模拟分布式.Hadoop本身是无法区分伪分布式和分布式的,两种配置也很相似.唯一不同的地方是伪分布式是在单机器上配置,数据节点和名字节点均 是一个机器. 二.环境说明:      操作系统:Cent Os 6.7      hadoop版本:hadoop-2.7.2      JDK版本:jdk1.8_77     备注:

Java中介模式(Mediator模式)

Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性. 如何使用中介模式 首先 有一个接口,用来定义成员对象之间的交互联系方式:    public inte

HBase入门基础教程 HBase之单机模式与伪分布式模式安装

在本篇文章中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建HBase伪分布式环境的前提是我们已经搭建好了Hadoop完全分布式环境,搭建Hadoop环境请参考:[Hadoop入门基础教程]4.Hadoop之完全分布式环境搭建 开发环境 硬件环境:CentOS 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.Eclipse Juno Service Release 2.hadoop-1

【HBase基础教程】1、HBase之单机模式与伪分布式模式安装

在这篇blog中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建hbase伪分布式环境的前提是我们已经搭建好了hadoop完全分布式环境,搭建hadoop环境请参考:[Hadoop基础教程]4.Hadoop之完全分布式环境搭建 开发环境 硬件环境:Centos 6.5 服务器4台(一台为Master节点,三台为Slave节点) 软件环境:Java 1.7.0_45.Eclipse Juno Service Release 2.hadoop-1

中介模式

中介模式: 公开一个统一的接口,限制系统的不同部分可以通过该接口进行通信: 系统不同部分不再显示的引用彼此: 属于行为设计模式. 生活中例子: 机场交通控制系统:机场控制塔(中介者)处理飞机的起飞和降落,因为所有通信(监听到或发出的通知)都是从飞机到控制塔,而不是飞机和飞机直接相互通信. 优点: 能够将系统中对象或组件之间所需的通信渠道从多对多减少到多对一. 缺点: 会导致性能下降,因为它们总是间接地进行通信: 会引入单一故障点. 区别: 和中介者模式比较相似的有观察者模式和外观模式,如下: -

设计模式3(原型模式,中介模式)

原型模式 Delphi中实现是将创建方法进行了strict private 处理 Clone方法不仅产生新的实例,还要对原来对象的属性等进行Clone Tcontractprototype=class(IPrototype) Strict provide Create(Aobject:Tcontractprototype) Public Function Clone:TContractPrototype; End; 中介者模式 封装对象之前的交互 体现了依赖抽象不依赖子类的原则,同事通过中介来触