zoukankan      html  css  js  c++  java
  • 设计模式 | 中介者模式/调停者模式(Mediator)

    定义:

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

    结构:(书中图,侵删)

    一个抽象中介者
    若干具体中介者
    一个抽象同事类
    若干个具体同事类

    实例:

    我觉得git就相当于一个中介者,用户之间不用互相认识,但是可以互相改代码。
     
    抽象中介接口:
    package designpattern.mediator;
    
    public interface Mediator {
        public void commit(String memo, User sender);
    }

    用户类(抽象同事类):

    package designpattern.mediator;
    
    public abstract class User {
        protected Mediator mediator;
    
        public User(Mediator mediator) {
            this.mediator = mediator;
        }
    }

     仓库所有者类(具体同事类):

    package designpattern.mediator;
    
    public class Owner extends User {
        public Owner(Mediator mediator) {
            super(mediator);
        }
    
        public void commit(String memo) {
            mediator.commit(memo, this);
        }
    
        public void receive(String memo) {
            System.out.println("所有者收到信息:" + memo);
        }
    }

    开发者类(具体同事类):

    package designpattern.mediator;
    
    public class Developer extends User {
    
        public Developer(Mediator mediator) {
            super(mediator);
        }
    
        public void commit(String memo) {
            mediator.commit(memo, this);
        }
    
        public void receive(String memo) {
            System.out.println("开发者收到信息:" + memo);
        }
    }

    GitHub类(具体中介者类):

    package designpattern.mediator;
    
    public class GitHub implements Mediator {
        Owner owner;
        Developer developer;
    
        public void setOwner(Owner owner) {
            this.owner = owner;
        }
    
        public void setDeveloper(Developer developer) {
            this.developer = developer;
        }
    
        @Override
        public void commit(String memo, User sender) {
            if (sender == owner) {
                developer.receive(memo);
            } else {
                owner.receive(memo);
            }
        }
    
    }

    客户端:

    package designpattern.mediator;
    
    public class Client {
        public static void main(String[] args) {
            GitHub gitHub = new GitHub();
            Owner owner = new Owner(gitHub);
            Developer developer = new Developer(gitHub);
            gitHub.setOwner(owner);
            gitHub.setDeveloper(developer);
    
            owner.commit("我新建了一个项目");
            developer.commit("我帮你改了一个BUG");
        }
    
    }

    结果输出:

    开发者收到信息:我新建了一个项目
    所有者收到信息:我帮你改了一个BUG

    总结:

    虽然解耦了同事类,但他们和中介类的耦合挺紧密的,并且每新增一个类,中介类都要相应修改。对于复杂系统来说,中介类会过于的复杂。
    所以要谨慎使用这个模式。
    书中提到的适用场景:
    中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合(比如一个程序窗体(中介者)之于其中的各种组件(按钮、菜单、显示框等同事类))
    以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
  • 相关阅读:
    java利用透明的图片轮廓抠图
    java单例之enum实现方式
    spring之ControllerAdvice注解
    memcached命令
    2016年开源巨献:来自百度的71款开源项目
    dubbo通信协议之对比
    Elasticsearch权威指南(中文版)
    Apache shiro之权限校验流程
    简单的freemarker解析测试
    Apache shiro之身份验证(登陆)流程
  • 原文地址:https://www.cnblogs.com/imoqian/p/13908062.html
Copyright © 2011-2022 走看看