zoukankan      html  css  js  c++  java
  • 中介者模式

    定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。

    当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。

    使用场景: 
    当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其

    他对象的行为,可使用中介者模式。

    UML图

    这里写图片描述

    Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。

    ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。

    Colleague:抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。

    ConcreteColleague:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。

    代码:

    public abstract class Colleague {
        //抽象同事类
    
        protected Mediator mediator;
    
        public void setMediator(Mediator mediator) {
            this.mediator = mediator;
        }
    
        public abstract void operation();
    }
        
    

      

    public class ConcreteColleagueA extends Colleague{
       //具体同事类
        public void notifyColleagueB() {
            mediator.notifyColleagueB();
        }
    
        @Override
        public void operation() {
            System.out.print("this is ConcreteColleagueA's operation
    ");
        }
    }
    

      

    public abstract class Mediator {
        //抽象中介者类
        protected Colleague colleagueA;
        protected Colleague colleagueB;
    
        public Mediator(Colleague colleagueA, Colleague colleagueB) {
            this.colleagueA = colleagueA;
            this.colleagueB = colleagueB;
        }
    
        public abstract void notifyColleagueA();
        public abstract void notifyColleagueB();
    }
    

      

    public class ConcreteMediator extends Mediator{
        //具体中介者类
        public ConcreteMediator(Colleague colleagueA, Colleague colleagueB) {
            super(colleagueA, colleagueB);
        }
    
        @Override
        public void notifyColleagueA() {
            if (colleagueA != null) {
                colleagueA.operation();
            }
        }
    
        @Override
        public void notifyColleagueB() {
            if (colleagueB != null) {
                colleagueB.operation();
            }
        }
    }
    

      

    public class Client {
        public static void main(String[] args) {
            Colleague colleagueA = new ConcreteColleagueA();
            Colleague colleagueB = new ConcreteColleagueB();
    
            Mediator mediator = new ConcreteMediator(colleagueA, colleagueB);
            colleagueA.setMediator(mediator);
            colleagueB.setMediator(mediator);
    
            ((ConcreteColleagueA)colleagueA).notifyColleagueB();
            ((ConcreteColleagueB)colleagueB).notifyColleagueA();
        }
    }
    

      优点:

        适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。

        使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。

        使用中介者模式可以将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。

      缺点:

        中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,

    因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

    所以,我们决定使用中介者模式之前要多方考虑、权衡利弊。

    转自https://blog.csdn.net/u012124438/article/details/70474166

     

  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/a863886199/p/10165501.html
Copyright © 2011-2022 走看看