• 设计模式学习笔记十八:中介者模式


    设计模式学习笔记十八:中介者模式

    介绍

    中介者(MEDIATOR)模式属于对象行为型模式。主要目的是将对象间复杂的调用关系进行解耦。使所有的对象都通过这个中介者进行交互。

    优点

    • 对象解耦,提供了复用性;
    • 简化了单个对象的交互逻辑;

    缺点

    • 中介者业务性太强,黑箱子的雏形。

    其他

    • 如果同事过多,逻辑过多,不管是否使用这种模式,循环调用这种事情都很难查找了。

    使用场景

    代码抽象良好,但是对象之间存在互相调用的情况建议使用中介者模式。

    UML结构图:

    Mediator

    代码实现

    1.定义中介者,即Mediator

    public interface Mediator {
        public void change(Colleague colleague);
    }
    

    2.中介者具体实现。即ConcreteMediator

    public class ConcreteMediator implements Mediator {
        @Override
        public void change(Colleague colleague) {
            if (colleague instanceof ConcreteColleague1) {
                concreteColleague1Call((ConcreteColleague1) colleague);
            } else if (colleague instanceof ConcreteColleague2) {
                concreteColleague2Call((ConcreteColleague2) colleague);
            } else {
                throw new UnsupportedOperationException("unspported colleague");
            }
        }
    
        private void concreteColleague1Call(ConcreteColleague1 colleague) {
            colleague.call();
        }
    
        private void concreteColleague2Call(ConcreteColleague2 colleague) {
            colleague.call();
        }
    
    }
    

    3.定义同事抽象,即Colleague

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

    4.具体同事具体实现,即ConcreteColleague1和ConcreteColleague2

    public class ConcreteColleague1 extends Colleague {
        public ConcreteColleague1(Mediator mediator) {
            super(mediator);
        }
    
        public void doSmth() {
            System.out.println("ConcreteColleague1做了一些事情");
            mediator.change(this);
        }
    
        public void call() {
            System.out.println("外部调用ConcreteColleague1");
        }
    
    }
    
    public class ConcreteColleague2 extends Colleague {
        public ConcreteColleague2(Mediator mediator) {
            super(mediator);
        }
    
        public void doSmth() {
            System.out.println("ConcreteColleague2做了一些事情");
            mediator.change(this);
        }
    
        public void call() {
            System.out.println("外部调用ConcreteColleague2");
        }
    
    }
    

    5.测试调用,TestDrive

    public class Run {
        public static void main(String[] args) {
            Mediator mediator = new ConcreteMediator();
            ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
            ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
            colleague1.doSmth();
            colleague2.doSmth();
        }
    }
    
  • 相关阅读:
    ubuntu中安装monodevelop
    谈谈asp.net中的<% %>,<%= %>,<%# %><%$ %>的使用
    asp.net中的App_GlobalResources和App_LocalResources使用
    cisco通过控制口或者通过远程配置交换机
    匿名函数
    迭代器生成器
    闭包函数,装饰器
    函数之对象和名称空间与作用域
    函数
    文件操作
  • 原文地址:https://www.cnblogs.com/liushijie/p/4777475.html
Copyright © 2020-2023  润新知