• 中介者模式(Mediator)


    1、概念

    中介者模式用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,属于对象行为型模式一种。

    2、模式结构

    • Mediator: 抽象中介者,定义一个接口,该接口用于与各同事对象之间进行通信
    • ConcreteMediator: 具体中介者,抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用
    • Colleague: 抽象同事类,定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信
    • ConcreteColleague: 具体同事类,是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法

    3、使用场景

    • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
    • 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
    • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类
    • 交互的公共行为,如果需要改变行为则可以增加新的中介者类

    4、优缺点

    优点:

    • 降低了类的复杂度,将一对多转化成了一对一
    • 将系统的各个对象之间的相互关系进行封装,使各同事类解耦
    • 减少子类生成
    • 可以简化各同事类的设计和实现

    缺点:

    • 由于中介者对象封装了系统中对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难

    5、实例

    定义抽象同事Person

    public abstract class Person {
        private String name;
        private Mediator mediator;
    
        Person(String name, Mediator mediator) {
            this.name = name;
            this.mediator = mediator;
        }
    
        public String getName() {
            return name;
        }
    
        public Mediator getMediator() {
            return mediator;
        }
    }
    

    定义具体同事类Landlord

    public class Landlord extends Person {
    
        public Landlord(String name, Mediator mediator) {
            super(name, mediator);
        }
    
        /**
         * @desc 与中介者联系
         * @param message
         * @return void
         */
        public void contact(String message){
            getMediator().contact(message, this);
        }
    
        /**
         * @desc 获取信息
         * @param message
         * @return void
         */
        public void getMessage(String message){
            System.out.println("房东:" + getName() +",获得信息:" + message);
        }
    }
    

    定义具体同事类Renters

    public class Renters extends Person {
    
        public Renters(String name, Mediator mediator) {
            super(name, mediator);
        }
    
        /**
         * @desc 与中介者联系
         * @param message
         * @return void
         */
        public void contact(String message){
            getMediator().contact(message, this);
        }
    
        /**
         * @desc 获取信息
         * @param message
         * @return void
         */
        public void getMessage(String message){
            System.out.println("租房者:" + getName() +",获得信息:" + message);
        }
    }
    

    定义抽象中介者Mediator

    public abstract class Mediator {
        //申明一个联络方法
        public abstract void contact(String message, Person person);
    }
    

    定义具体中介者MediatorStructure

    public class MediatorStructure extends Mediator {
    
        //首先中介结构必须知道所有房主和租房者的信息
        private Landlord landlord;
        private Renters renters;
    
        public Landlord getLandlord() {
            return landlord;
        }
    
        public Renters getRenters() {
            return renters;
        }
    
        public void setLandlord(Landlord landlord) {
            this.landlord = landlord;
        }
    
        public void setRenters(Renters renters) {
            this.renters = renters;
        }
    
        public void contact(String message, Person person) {
            if (person == landlord) {          //如果是房主,则租房者获得信息
                renters.getMessage(message);
            } else {       //反正则是房主获得信息
                landlord.getMessage(message);
            }
        }
    }
    

    客户端调用

    //一个房主、一个租房者、一个中介机构
    MediatorStructure mediator = new MediatorStructure();
    
    //房主和租房者只需要知道中介机构即可
    Landlord landlord = new Landlord("张三", mediator);
    Renters renters = new Renters("李四", mediator);
    
    //中介结构要知道房主和租房者
    mediator.setLandlord(landlord);
    mediator.setRenters(renters);
    
    renters.contact("听说你那里有房出租.....");
    landlord.contact("是的!请问你需要租什么类型的房?");
    
  • 相关阅读:
    如何在SpringMVC项目中部署WebService服务并打包生成客户端
    Spring MVC前后端数据交互总结
    JAVA总结---序列化的三种方式
    jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore
    Jackson-deserialization fails on circular dependencies(JackSon无限递归问题)
    @JsonIgnore @JsonIdentityInfo 处理Hibernate 循环引用的问题
    hibernate中因双向依赖而造成的json怪相--springmvc项目
    jackson java转json hibernate懒加载造成的无限递归问题
    C/C++使用心得:enum与int的相互转换
    浅析长子继承制对英国社会的影响
  • 原文地址:https://www.cnblogs.com/fomin/p/10018963.html
Copyright © 2020-2023  润新知