1. 程式人生 > >23種設計模式--中介者模式-Mediator Pattern

23種設計模式--中介者模式-Mediator Pattern

ole 缺點 業務 -m ram -- 成了 ons 錯誤

一、中介者模式的介紹

中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,當然筆者也希望來個婚姻中介給我介紹一個哈哈哈,,回歸正題中介者模式分成中介者類和用戶類,根據接口編程的方式我們再把中介和用戶類分成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