软件设计模式之中介者模式实验

软件设计模式之中介者模式实验

一、实验目的

掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题。

二、实验内容与要求

内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对租房中介的工作进行模拟,程序设计语言可自由选择。
要求:需要用“文字+代码+截图”的形式对实验的主要代码和运行结果进行展示和描述。

三、实验方法

  1. 抽象中介者:定义了同事对象到中介者对象的接口
package com.middleman.java;

public abstract class Mediator {
    /**
     * 注册同事方法
     */
    public abstract void register(String key, Colleague colleague);
    /**
     * 发送消息
     */
    public abstract void sendMessage(String key);
}
  1. 抽象同事类
package com.middleman.java;

public abstract class Colleague {
    /**
     * 发送消息
     */
    public abstract void sendMessage();
    /**
     * 接收消息
     */
    public abstract void receiveMessage();
}
  1. 具体同事类:持有抽象中介者角色引用
    房东类:
package com.middleman.java;

public class Landlord extends Colleague {
    private static final String USER_A_REGISTER_KEY = "userA";
    private static final String USER_B_REGISTER_KEY = "userB";
    /**
     * 持有一个抽象中介者对象引用
     */
    private Mediator mediator;
 
    public Landlord(Mediator mediator) {
        this.mediator = mediator;
        mediator.register(USER_A_REGISTER_KEY, this);
    }
 
    @Override
    public void sendMessage() {
        System.out.println("房东向中介发出出租和房间的具体情况信息");
        mediator.sendMessage(USER_B_REGISTER_KEY);
    }
 
    @Override
    public void receiveMessage() {
        System.out.println("房东从中介收到租客发出的比较匹配的租房信息");
    }
}

租客类:

package com.middleman.java;

public class Renter extends Colleague {
    /**
     * 持有一个抽象中介者对象引用
     */
    private Mediator mediator;
    private static final String USER_A_REGISTER_KEY = "userA";
    private static final String USER_B_REGISTER_KEY = "userB";
 
    public Renter(Mediator mediator) {
        this.mediator = mediator;
        mediator.register(USER_B_REGISTER_KEY, this);
    }
 
    @Override
    public void sendMessage() {
        System.out.println("租客向中介发出租房信息和具体要求");
        mediator.sendMessage(USER_A_REGISTER_KEY);
    }
 
    @Override
    public void receiveMessage() {
        System.out.println("租客从中介收到符合条件的房东出租信息");
    }
}
  1. 具体中介者
package com.middleman.java;

import java.util.HashMap;
import java.util.Map;

public class Institution extends Mediator {
	 
    /**
     * 具体中介者类持有多个同事类对象引用
     * 这里使用Map保存,当然也可以使用List或者其他集合进行保存
     */
    private Map<String, Colleague> colleagueMap = new HashMap<>();
 
    @Override
    public void register(String key, Colleague colleague) {
        colleagueMap.put(key, colleague);
    }
 
    @Override
    public void sendMessage(String key) {
        Colleague colleague = colleagueMap.get(key);
        if (null != colleague) {
            colleague.receiveMessage();
        }
    }
}
  1. 客户端
package com.middleman.java;

public class Client {
    public static void main(String[] args) {
        Mediator qqServer = new Institution();
        Colleague userA = new Landlord(qqServer);
        Colleague userB = new Renter(qqServer);
        //房东向中介发出出租消息
        userA.sendMessage();
 
        System.out.println("***************************");
 
        //租客向中介发出租房消息
        userB.sendMessage();
    }
}

四 、实验结果

  1. 实验截图:
    在这里插入图片描述

  2. 实验中把房产中介当做中介者,通过具体中介者对象,解耦了各个同事类之间相互依赖的场景,使同事类直接都与中介者对象发生关联。

  3. 中介者模式虽然降低了对象之间的耦合性,使得对象易于独立地被复用,并且将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

  4. 但是,我认为具体中介者角色承担了较多的职责,其他对象都通过中介者来进行关联,一旦中介者出现了问题,整个系统将会受到重大的影响,还是要具体情况具体分析,中介者模式不一定适用于所有场景。

相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰(刘运强)老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能的MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一、性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二、MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三、高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四、面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。</span> </p>
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页