23种设计模式--中介者模式-Mediator Pattern
一、中介者模式的介绍
中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再把中介和用户类分成2个类,这样就成了抽象中介者角色,具体中介者角色、抽象同事类和具体同事类。来几个例子比如说各种游戏平台,还有我们最熟悉的QQ平台,等等这些都是中介者模式的具体应用,中介者模式常用于处理通信之间复杂有关联的业务,这样就会存在一个缺点比如说因为中介者处理了好多用户之间的关系,一但发生错误影响会是多个类,理论就说到,最近大家都知道邹市明大满贯了那么我们就用打拳击这个事来说下中介者模式吧;
二、中介者模式Demo
不使用中介者模式的Demo
/// <summary>
/// 拳击者得类包括得分,和受到攻击时得分变化得方法
/// </summary>
public abstract class AbstractFight
{
//得分
public double grade;
/// <summary>
/// 受到打击时或者主动出击时得分得变化
/// </summary>
/// <param name="num"></param>
/// <param name="fight"></param>
public abstract double ChangeGrade(double num, AbstractFight fight);
}
///具体实现
public class ZouShimingFight : AbstractFight
{
/// <summary>
/// 邹市明被打时得分下降,坤比七得分上涨
/// num表示得分,fight表示坤比七对象
/// </summary>
/// <param name="num"></param>
/// <param name="fight"></param>
public override double ChangeGrade(double num, AbstractFight fight)
{
this.grade -= num;
fight.grade = fight.grade + num;
return this.grade;
}
}
public class KunBiQiFight : AbstractFight
{
public override double ChangeGrade(double num, AbstractFight fight)
{
this.grade -= num;
fight.grade = fight.grade + num;
return this.grade;
}
}
///调用
AbstractFight zouFight = new ZouShimingFight();
zouFight.grade = 100;
AbstractFight kunFigeht = new KunBiQiFight();
kunFigeht.grade = 100;
Console.WriteLine("比赛开始");
double zouGrade=zouFight.ChangeGrade(10, kunFigeht);
double kunGrade = kunFigeht.ChangeGrade(30, zouFight);
if (zouGrade > kunGrade)
{
Console.WriteLine("邹市明胜利");
}
使用中介者模式的Demo
/// <summary>
/// 拳击者得类包括得分,和受到攻击时得分变化得方法
/// </summary>
public abstract class AbstractFight
{
//得分
public double grade;
/// <summary>
/// 受到打击时或者主动出击时得分得变化
/// </summary>
/// <param name="num"></param>
/// <param name="fight"></param>
public abstract double ChangeGrade(double num, AbstractMediator fight);
}
/// <summary>
/// 抽象中介者
/// </summary>
public abstract class AbstractMediator
{
protected AbstractFight zouFight;
protected AbstractFight kunFight;
public AbstractMediator(AbstractFight _zouFight,AbstractFight _kunFight)
{
zouFight = _zouFight;
kunFight = _kunFight;
}
/// <summary>
/// 邹市明被打得分
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public abstract double ZouEmbattled(double num);
/// <summary>
/// 坤比七被打得分
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public abstract double KunEmbattled(double num);
}
/// <summary>
/// 实现抽象中介者
/// </summary>
public class MeditorFight : AbstractMediator
{
public MeditorFight(AbstractFight _zouFight, AbstractFight _kunFight) : base(_zouFight, _kunFight)
{
}
public override double KunEmbattled(double num)
{
zouFight.grade -= num;
kunFight.grade = kunFight.grade + num;
return zouFight.grade;
}
public override double ZouEmbattled(double num)
{
kunFight.grade -= num;
zouFight.grade = zouFight.grade + num;
return kunFight.grade;
}
}
/// <summary>
/// 具体实现
/// </summary>
public class ZouShimingFight : AbstractFight
{
public override double ChangeGrade(double num, AbstractMediator fight)
{
return fight.ZouEmbattled(num);
}
}
public class KunBiQiFight : AbstractFight
{
public override double ChangeGrade(double num, AbstractMediator fight)
{
return fight.KunEmbattled(num);
}
}
///调用
AbstractFight zouFight = new ZouShimingFight();
zouFight.grade = 100;
AbstractFight kunFight = new KunBiQiFight();
kunFight.grade = 100;
//解耦
AbstractMediator mFight =new MeditorFight(zouFight, kunFight);
Console.WriteLine("比赛开始");
double zouGrade=zouFight.ChangeGrade(10, mFight);
double kunGrade = kunFight.ChangeGrade(30, mFight);
if (zouGrade > kunGrade)
{
Console.WriteLine("邹市明胜利!!");
}
Console.ReadKey();
三、GitHub
https://github.com/wangtongzhou520/Designpattern
23种设计模式--中介者模式-Mediator Pattern的更多相关文章
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- 中介者模式(Mediator Pattern)
用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...
- 实践GoF的23种设计模式:建造者模式
摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...
- JAVA开发的23种设计模式之 --- 桥接模式
桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构. 应用场景 实现系统可能有多 ...
- 24种设计模式--中介者模式【Mediator Pattern】
各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
随机推荐
- 将表里的数据批量生成INSERT语句的存储过程 增强版
将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...
- Linux CentOS 配置JDK环境
一.下载JDK 下载JDK的方式有两种: 1.Linux中使用wget下载 1.使用命令安装wget yum install wget 2.下载 wget 'http://download.oracl ...
- PHP数据类型之间的强制转换
1.实型数据强制转换为整型数据 $float1=2.7; $int1=(int)$float1; echo var_dump($int1),"<br>"; 输出: in ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解五:页面布局基础知识
说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...
- CRL快速开发框架系列教程三(更新数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Go web开发初探
2017年的第一篇博客,也是第一次写博客,写的不好,请各位见谅. 本人之前一直学习java.java web,最近开始学习Go语言,所以也想了解一下Go语言中web的开发方式以及运行机制. 在< ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- 用MongoDB分析合肥餐饮业
看了<从数据角度解析福州美食>后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了Node.js爬虫爬取了合肥的大众点评数据.分析数据库我并没有采用MySQL而是用的MongoDB,是因为 ...
- AbpZero--2.如何启动
1.直接启动 VS中直接启动 2.IIS站点 IIS中配置一个站点来启动(推荐) 3.登录 系统默认创建2个用户 默认用户名:admin 密码:123qwe 租户:Default 默认用户名:adm ...