【设计模式】(二十五)--行为型模式--中介者模式

【设计模式】(二十五)–行为型模式–中介者模式

中介者模式定义

Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly. and it lets you vary their interaction independently.

意思是:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示的相互作用,从而使其松散耦合,而且可以独立地改变它们之间的交互。
中介者模式一般有4个元素:

  • Mediator 抽象中介者,定义了同事对象到中介者对象的统一接口,用于各个同事角色之间的通信。
  • Concrete Mediator 具体中介者,实现了中介者声明的操作,依赖于各个同事角色,并通过协调各个同事实现协作行为。
  • Colleague 抽象同事,定义了中介者到同事对象的接口,同事对象只知道中介者而不知道其余同事对象。
  • Concrete Colleague 具体同事,实现了同事接口的具体类,每一个具体同事类都清楚自己范围内的行为,但是不清楚扩大范围后的目的。

中介者模式的优点

  • 1、降低了类的复杂度,将一对多转化成了一对一。
  • 2、各个类之间的解耦,各个同事类只依赖于中介者,使得同事类更容易复用,中介者类和同事类都可以相对独立的演化。
  • 3、符合迪米特原则。

中介者模式虽然降低了同事对象的复杂性,但是中介者类还要处理协调事务大大的增加了终结者类的复杂性,中介者类不注意很容易膨胀到难以维护。所以要注意一下情况:

  • 不应当在责任划分混乱时使用。尤其是在系统设计之初,需求不大确定时,直接引入中介者,责任划分的不清,很可能会导致对象之间关系混乱,系统难以维护。
  • 合理的使用封装,不应当对数据类和方法类使用。

中介者模式的使用场景

  • 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

中介者模式的简单实现

类图
在这里插入图片描述

实现

public class Test {
    public static void main(String[] args) {
        BeiWaiHeros beiWaiHeros = new BeiWaiHerosImpl();
        User user = new Gamer("大少", "射手", beiWaiHeros);
        User user1 = new Gamer("大少小号1", "坦克", beiWaiHeros);
        User user2 = new Gamer("大少小号2", "法师", beiWaiHeros);
        User user3 = new Gamer("二少", "战士", beiWaiHeros);
        User user4 = new Gamer("二少小号1", "辅助", beiWaiHeros);


        user.willPlay();
        user1.willPlay();
        user2.willPlay();
        user3.willPlay();
        user4.willPlay();

        User user5 = new Gamer("三少", "刺客", beiWaiHeros);
        User user6 = new Gamer("三少", "法师", beiWaiHeros);

    }
}
public interface BeiWaiHeros {
    void login(User user);

    void match(User user);
}
public class BeiWaiHerosImpl implements BeiWaiHeros {

    List<User> onlineUser = new ArrayList<>();

    List<User> matchingUser = new ArrayList<>();

    int playingCount = 0;

    private final int COUNT = 4;

    private final String RED = "红色方";
    private final String BLUE = "蓝色方";

    @Override
    public void login(User user) {
        onlineUser.add(user);
        System.out.println("登录成功,在线人数:" + onlineUser.size() + "," + playingCount + "玩家正在游戏中!");
    }

    @Override
    public void match(User user) {
        matchingUser.add(user);
        if (COUNT == matchingUser.size()) {
            playingCount = playingCount + COUNT;
            System.out.println("游戏匹配成功!游戏开始");
            matchingUser.clear();
            return;
        }
        int estimateTime = (COUNT - matchingUser.size()) * 2;
        System.out.println("正在匹配人数" + matchingUser.size() + "玩家" + user.getName() + ",预计需要等待" + estimateTime + "秒!");
    }
}
public abstract class User {
    private String name;
    private String commonlyHero;
    BeiWaiHeros beiWaiHeros;
    private String camp;

    public User(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
        this.name = name;
        this.commonlyHero = commonlyHero;
        this.beiWaiHeros = beiWaiHeros;
        beiWaiHeros.login(this);
    }

    public void setCamp(String camp) {
        this.camp = camp;
    }

    public void willPlay() {
        beiWaiHeros.match(this);
    }

    public String getName() {
        return name;
    }
}
public class Gamer extends User {

    public Gamer(String name, String commonlyHero, BeiWaiHeros beiWaiHeros) {
        super(name, commonlyHero, beiWaiHeros);
    }
}

结果
在这里插入图片描述
实现说明,通过一个BeiWaiHeros游戏,BeiWaiHeros游戏是一个2v2的pvp游戏,实现中介者模式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值