• 设计之禅——中介者模式


    引言

    在面向对象编程中,无可避免的是对象之间的引用,引用给我们带来便捷(对象的复用),但同时也会给类与类之间造成强依赖关系。在一对一的关系中,这看起来并不会造成什么不良的影响,但若是在一对多中,修改任意的一个对象,都会影响到其它调用者,形成强耦合。

    中介者

    在这里插入图片描述
    如同上面的图,当对象之间形成网络结构之后,改变5号对象只会影响到4号对象,改变1号对象,其引用它的4、5、6号对象都需要作出相应的改变,而改变2号对象其它5个对象都需要作出改变,我们想要跟踪对象的引用是非常的困难的,因此我们需要将其解耦。
    那要如何做呢?
    不难发现,我们只需要将网络结构中的一对多的引用改造成为一对一的结构,那么不就非常简单了么。
    在这里插入图片描述
    像上面这样,引入一个中介者对象,所有对象之间的联系都必须通过中介者来处理,这样,所有对象也就只有一个对象与之关联,我们在修改任意的对象时也只需要修改中介者对象对应的逻辑即可,引用的跟踪也不再是难事了。这就是中介者模式的威力。

    Coding

    在现实生活中,我们可以看到很多中介者的例子,有时我们也会与其打交道,比如找房屋中介租房,下面就以这个例子来说明,首先是房东和租客,这里为了处理方便,使它们都继承自抽象的people类:

    public class Person {
    
        protected String name;
        protected String message;
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMessage() {
            return this.name + "收到消息:" + this.message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    
    public class Landlord extends Person {
    
        public Landlord(String name) {
            super(name);
        }
    }
    
    public class Tenant extends Person {
    
        public Tenant(String name) {
            super(name);
        }
    }
    

    然后是中介者类(考虑到以后的扩展,抽象出一个抽象的中介者,并持有contact方法,房东和租客则是通过中介者来取得联系)

    public abstract class AbstractMediator {
    
        public abstract void contact(String message, Person person);
    
    }
    
    public class HouseMediator extends AbstractMediator {
    
        @Override
        public void contact(String message, Person person) {
            person.setMessage(message);
        }
    }
    

    最后测试

        public static void main(String[] args) {
            AbstractMediator mediator = new HouseMediator();
    
            Person landlord = new Landlord("房东");
            mediator.contact("我要租房", landlord);
            System.out.println(landlord.getMessage());
    
            Tenant tenant = new Tenant("租客");
            mediator.contact("一个月500", tenant);
            System.out.println(tenant.getMessage());
        }
    

    打印如下结果:

    房东收到消息:我要租房
    租客收到消息:一个月500
    

    像上面这样就实现了一个中介者模式,我们改动任意的对象(房东或是租客),受到影响的仅仅只有中介者。当然,这里只是为了说明中介者模式,例子本身简单,没有必要使用中介者模式,但不妨想想,对象一旦增多,并相互引用,这个模式带给我们的好处不言而喻。

    总结

    中介者模式可以帮助我们解除对象之间的耦合,但是在实际编码中并不是经常被使用。因为它会使得体系结构变得非常复杂,在使用该模式之前,我们首先应该想想是不是本身的设计是否存在问题。

  • 相关阅读:
    Google Earth 使用的经纬度格式及转换
    ADO.NET Entity Framework 一个简单数据绑定例子
    Oracle 异常 ORA01861: literal does not match format string(字符串格式不匹配)
    备份和还原 甲方 Oracle 数据库 问题一大堆
    使用 xsd.exe 命令工具 将 xsd架构 生成 类文件
    简单的源代码统计工具(统计源代码行数、工数、成本、质量指标统计)
    Google KML 起步教程笔记(二)高级 KML 文档与MIME 类型
    SQL Server 2008 中的空间数据存储
    PowerCmd 很好用的命令行工具,也许大家早就知道。
    Google Earth 本地地图缓存文件路径和KML文件路径
  • 原文地址:https://www.cnblogs.com/yewy/p/13111835.html
Copyright © 2020-2023  润新知