首页 > 其他分享 >设计模式(十七)中介者

设计模式(十七)中介者

时间:2023-12-18 09:22:05浏览次数:30  
标签:十七 Console mediator void 同事 中介 设计模式 public

一、定义

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

二、描述

在中介者模式中,引入了用于协调其他对象/类之间的相互调用的中介者类,为了让系统具有更好的灵活性和可扩展性,通常还提供了抽象中介者,包含以下四个角色:1、Mediator(抽象中介者):它定义了一个接口,该接口用于与各同事对象之间进行通信。
2、ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,维持了各个同事对象的引用。
3、Colleague(抽象同事类):它定义了各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
4、ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事对象需要和其他对象通信时,先与中介者对象通信,通过中介者来间接完成与其他同事类的通信,在具体同事类中实现了在抽象同事类中声明的抽象方法。

三、例子

X公司欲开发一套CRM系统,其中包含一个客户信息管理模块,界面包含了按钮、文本框、列表框、下拉框等多个组件,增加或删除一个客户,各组件均会发生联动效果,较为复杂。
Mediator:抽象中介者

public abstract class Mediator
{
    public abstract void ComponenetChanged(Component c);
}

ConcreteMediator:具体中介者

public class ConcreteMediator : Mediator
{
    // 维持对各个同事对象的引用
    public Button addButton;
    public List list;
    public TextBox userNameTextBox;
    public ComboBox cb;

    // 封装同事对象之间的交互
    public override void ComponenetChanged(Component c)
    {
        // 单击按钮
        if (c == addButton)
        {
            Console.WriteLine("-- 单击增加按钮 --");
            list.Update();
            cb.Update();
            userNameTextBox.Update();
        }
        // 从列表框选择客户
        else if (c == list)
        {
            Console.WriteLine("-- 从列表框选择客户 --");
            cb.Select();
            userNameTextBox.SetText();
        }
        // 从组合框选择客户
        else if (c == cb)
        {
            Console.WriteLine("-- 从组合框选择客户 --");
            cb.Select();
            userNameTextBox.SetText();
        }
    }
}

Component:抽象组件,充当抽象同事类(Colleague)

public abstract class Component
{
    protected Mediator mediator;

    public void SetMediator(Mediator mediator)
    {
        this.mediator = mediator;
    }

    // 转发调用
    public void Changed()
    {
        mediator.ComponenetChanged(this);
    }

    public abstract void Update();
}

Button、List、ComboBox、TextBox:按钮、列表框、组合框、文本框,具体组件,充当具体同事类(ConcreteColleague)

public class Button : Component
{
    public override void Update()
    {
        // 按钮不产生响应
    }
}

public class List : Component
{
    public override void Update()
    {
        Console.WriteLine("列表框增加一项:张无忌");
    }

    public void Select()
    {
        Console.WriteLine("列表框选中项:小龙女");
    }
}

public class ComboBox : Component
{
    public override void Update()
    {
        Console.WriteLine("组合框增加一项:张无忌");
    }

    public void Select()
    {
        Console.WriteLine("组合框选中项:小龙女");
    }
}

public class TextBox : Component
{
    public override void Update()
    {
        Console.WriteLine("客户信息增加成功后文本框清空");
    }

    public void SetText()
    {
        Console.WriteLine("文本框显示:小龙女");
    }
}

Program:客户端测试类

// Step1.定义中介者对象
ConcreteMediator mediator = new ConcreteMediator();

// Step2.定义同事对象
Button addButton = new Button();
List list = new List();
ComboBox cb = new ComboBox();
TextBox userNameTextBox = new TextBox();

addButton.SetMediator(mediator);
list.SetMediator(mediator);
cb.SetMediator(mediator);
userNameTextBox.SetMediator(mediator);

mediator.addButton = addButton;
mediator.list = list;
mediator.cb = cb;
mediator.userNameTextBox = userNameTextBox;

// Step3.点击增加按钮
addButton.Changed();

Console.WriteLine("---------------------------------------------");

// Step4.从列表框选择客户
list.Changed();
Console.ReadLine();

四、总结

1、优点

(1)中介者模式简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。
(2)可将各同事对象解耦,中介者模式有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
(3)可以减少子类的生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展。

2、缺点

(1)具体中介者子类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

标签:十七,Console,mediator,void,同事,中介,设计模式,public
From: https://www.cnblogs.com/WinterSir/p/17516116.html

相关文章

  • 行为设计模式-策略模式的优缺点
    策略模式的作用就是把具体的算法实现从业务逻辑中剥离出来,成为一系列独立的算法类,使得他们可以相互替换。举个例子:平常生活中超时基本上都有活动,比如会员日全场9折,周年庆消费多少减多少,抽奖活动等等。那么如果将业务具体落实在代码上,是不是可以用多个条件判断来封装具体的业务逻辑,i......
  • 23种设计模式——模板模式
    今天我们来学习23种设计模式中的模板模式。模板模式需要注意抽象类与具体子类之间的协作。它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。概念:模板模式是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法......
  • Python实现软件设计模式4:建造者模式
    特点建造者模式是一步一步构建一个复杂的对象,属于对象创建型模式将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示关注如何逐步地创建一个复杂的对象或产品,不同的创造者定义了不同的创建过程用户不需要知道内部的具体构造细节、只用指定复杂对象的类......
  • Python实现软件设计模式3:抽象工厂模式
    特点系统中除了有多种产品类型(产品等级结构,如果汁、方便面、矿泉水),还出现了多个品牌(产品族,或农夫山泉、娃哈哈、康师傅、统一等品牌几乎都有这些产品)在工厂方法模式中,只有一个产品等级结构一个抽象产品(父类)、多个具体产品(子类)形成一个产品等级结构产品族是指由同一个工厂生产......
  • 设计模式概念和分类
    (设计模式概念和分类)概念设计模式一般是指软件开发人员在开发的时候遇到软件设计问题时的一般解决方案,这样当我们遇到重复问题的时候,就能够一次一次地使用该方案而避免了重复劳动。并且可以提高代码的可重用性和可读性,增强系统的可靠性和可维护性,解决一系列的复杂问题,提高协作效......
  • 结构性设计模式-适配器模式的优缺点
    把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。类的适配器模式对象的适配器模式对象适配器在上图中可以看出:冲突:Target期待调用Request方法,而Adaptee并没有(这就是所谓的不兼容了)。解决方案:为使Target能够使用Ad......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......
  • 设计模式:程序员的秘密武器(高手必备)
    在过去的几十年的职业生涯中,我观察到许多同事在技术方面取得了显著的进步和能力提升。然而,随着时间的推移,他们似乎逐渐遇到了一个发展的瓶颈。尽管大家都渴望以最快的速度提升自己的技能水平,但他们忽视了一个关键的因素,那就是内功修炼。是的,我相信大家都知道我们所说的内功心法指......
  • 小谈设计模式(21)—迭代器模式
    (小谈设计模式(21)—迭代器模式)专栏介绍主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。迭代器模式迭代器模式是一种行为型设计模式,它提供了一种访问聚合对象中各个元素的方法......
  • 写写我认知中的设计模式
    创建型我印象最深刻的就是单例模式,我记得他有一个特别经典的案例:任务管理器;而且我对这个模式的印象也比较深刻:将创建方法私有化,意味着不可以再次创建对象,仅对对象的调用。最近有所感悟的是生成器模式,其实上次软考的学习中我唯一不理解的就是生成器模式,当时听zst2003老师讲,一头雾......