当前位置: 首页 > article >正文

28 行为型模式-中介者模式

1 中介者模式介绍

在这里插入图片描述
在这里插入图片描述

2 中介者模式原理

在这里插入图片描述
在这里插入图片描述

3 中介者模式实现
/**
 * 抽象中介者
 **/
public interface Mediator {

    //处理同事对象注册与转发同事对象信息的方法
    void apply(String key);
}
/**
 * 具体中介者
 **/
public class MediatorImpl implements Mediator {

    @Override
    public void apply(String key) {
        System.out.println("最终中介者执行的操作,key为" + key);
    }
}
/**
 * 抽象同事类
 **/
public abstract class Colleague {

    private Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public Mediator getMediator() {
        return mediator;
    }

    //同事间进行交互的抽象方法
    public abstract void exec(String key);
}
/**
 * 具体同事类
 **/
public class ConcreteColleagueA extends Colleague{
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void exec(String key) {
        System.out.println("=====在A同事中,通过中介者执行!");
        getMediator().apply(key);
    }
}
/**
 * 具体同事类
 **/
public class ConcreteColleagueB extends Colleague{
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void exec(String key) {
        System.out.println("=====在B同事中,通过中介者执行!");
        getMediator().apply(key);
    }
}
public class Client {

    public static void main(String[] args) {

        //创建中介者
        Mediator mediator = new MediatorImpl();

        //创建同事对象
        Colleague c1 = new ConcreteColleagueA(mediator);
        c1.exec("key-A");

        Colleague c2 = new ConcreteColleagueB(mediator);
        c2.exec("key-B");
    }
}
4 中介者模式应用实例

【例】租房

/**
 * 抽象中介者
 **/
public abstract class Mediator {

    //创建联络方法
    public abstract void contact(String message, Person person);
}
/**
 * 抽象同事类
 **/
public abstract class Person {

    protected String name;

    //持有中介者的引用
    protected Mediator mediator;

    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}
/**
 * 具体的中介者-中介机构
 **/
public class MediatorStructure extends Mediator {

    //中介知晓 房租出租人和承租人的信息
    private HouseOwner houseOwner;  //房主

    private Tenant tenant;  //租房者

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    @Override
    public void contact(String message, Person person) {
        if(person == houseOwner){
            //如果是房主,则租房者获得信息
            tenant.getMessage(message);
        }else{
            //如果是租房者,则房租获得信息
            houseOwner.getMessage(message);
        }
    }
}
/**
 * 具体同事类-房租拥有者
 **/
public class HouseOwner extends Person {

    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    //与中介联系
    public void contact(String message){
        mediator.contact(message,this);
    }

    //获取信息
    public void getMessage(String message){
        System.out.println("房主: " + name +",获取到的信息: " + message);
    }
}
/**
 * 具体同事类-承租人
 **/
public class Tenant extends Person {

    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void contact(String message){
        mediator.contact(message,this);
    }

    public void getMessage(String message){
        System.out.println("租房者"+name+",获取到的信息: " + message);
    }
}
public class Client {

    public static void main(String[] args) {

        //中介机构
        MediatorStructure mediator =  new MediatorStructure();

        //房主
        HouseOwner houseOwner = new HouseOwner("张三", mediator);

        //租房者
        Tenant tenant = new Tenant("李四", mediator);

        //中介收集房主及租房者信息
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);

        //租房人的需求
        tenant.contact("需要在天通苑附近找一个,两室一厅的房子一家人住,房租在5000~6000之间");

        //房主的需求
        houseOwner.contact("出租一套天通苑地跌站附近的两室一厅,房租6000,可谈");
    }
}
5 中介者模式总结

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/news/108235.html

相关文章:

  • 2023高频前端面试题-http
  • Spring Boot 优雅配置yml配置文件定义集合、数组和Map
  • PG物理备份与恢复之pg_basebackup
  • 深入探究ASEMI肖特基二极管MBR60100PT的材质
  • 【PWN · heap | Off-By-One】Asis CTF 2016 b00ks
  • css列表样式
  • Spring Authorization Server入门 (十九) 基于Redis的Token、客户端信息和授权确认信息存储
  • 前端小技巧: TS实现数组转树,树转数组
  • LeetCode--196. 删除重复的电子邮箱
  • C++ 笔记
  • 深入了解 Elasticsearch 8.1 中的 Script 使用
  • 【swagger动态配置输入参数忽略某些字段】
  • 如何确定Apache Kafka的大小和规模
  • Azure - 自动化机器学习AutoML Azure使用详解
  • ruoyi vue前后端分离功能介绍
  • 基于 Redis + Lua 脚本实现分布式锁,确保操作的原子性
  • Web APIs——事件流
  • 【CSDN 每日一练 ★★☆】【字符串】外观数列
  • golang连接池检查连接失败时如何重试
  • Linux网络编程01
  • npm更新包时This operation requires a one-time password.
  • 数学家陶哲轩在形式证明帮助下发现论文中错误
  • moviepy处理手机端图片旋转问题
  • JAVA同城服务智慧养老小程序怎么开发?
  • 企业微信接入芋道SpringBoot项目
  • sql--索引使用
  • sharepoint2016-2019升级到sharepoint订阅版
  • python DevOps
  • uniapp实现瀑布流
  • Android问题笔记四十二:signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法