`
wangwengcn
  • 浏览: 175861 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

8.中介者模式(Mediator Pattern)

阅读更多

1.定义:

用一个中介对象封装一系列的对象交互,中介者使个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

 

2.解析:

这段话不明白没关系,我们先来看这样的一个场景:

公司有1个领导,9个职员,有一天领导要去公司的图书馆找一本书,领导一看图书馆的这本书已经被借走了,他就去问职员1有没有拿走,如果没有就继续问职员2……终于领导找到了他想看的书。
在这个例子中最差的情况下,领导对象竟然要和9个职员对象进行耦合,从我们软件设计的角度来看是相当不合理的。

我们把上面这个故事抽象成一个简单的程序就编程了这样的代码:

package _8MediatorPattern;

public interface Staff {

	public void borrowBook();
	public boolean bookIsBorrowed();
}
 
package _8MediatorPattern;

import java.util.Date;

public class Leader implements Staff {
	
	private Staff commonStaff;

	@Override
	public void borrowBook() {
		// 先看书在不在小职员手里
		if(commonStaff.bookIsBorrowed())
		{
			System.out.println("领导直接从图书馆借到了书!");
		}else {
			System.out.println("领导从小职员手里拿到了书,很简单!");
		}
	}

	@Override
	public boolean bookIsBorrowed() {
		// 随机产生,书有没有被借走
		return new Date().getTime()/2 == 0;
	}

	public Staff getCommonStaff() {
		return commonStaff;
	}

	public void setCommonStaff(Staff commonStaff) {
		this.commonStaff = commonStaff;
	}

}
 
package _8MediatorPattern;

import java.util.Date;

public class CommonStaff implements Staff {

	private Staff leader;
	
	@Override
	public void borrowBook() {
		if(leader.bookIsBorrowed())
		{
			System.out.println("小员工直接从图书馆借到了书!");
		}else {
			System.out.println("小员工从领导手里借到了书,不容易!");
		}
	}

	@Override
	public boolean bookIsBorrowed() {
		// 随机产生,书有没有被借走
		return new Date().getTime()/2 == 0;
	}

	public Staff getLeader() {
		return leader;
	}

	public void setLeader(Staff leader) {
		this.leader = leader;
	}

}

 

我们可以看到无论是职员还是领导,他们之间都相互耦合了。

现在上面这个故事我们继续:领导在借了三次书以后终于不耐烦,他决定给公司招一个图书管理员。那么他每次借书的时候只要跟管理员打招呼就行了:XXX,帮我把Java编程思想拿过来。然后管理员就去查询谁拿走了书,然后把书送到领导手里。

好了,我们讲到这里故事就结束了,因为中介者已经出现了。没错,这个管理员就是中介者。

 

3.中介者模式的结构(中介者模式又称为调停者模式)

  • 抽象中介者:抽象中介者角色定义统一的接口,用于各同事角色之间的通信。
  • 具体中介者:具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色。
  • 同事角色:每个同事角色都知道中介者角色 ,而且与其他的同事角色通信的时候,一定通过中介者角色协作。每个同事类的行为分为两种:一种是同事本身的行为,比如改变对象本身的状态,处理自己的行为等,这种方法叫做自发行为,与其他同事类或者中介者没有任何的依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。

4.中介者模式通用代码:

package _8MediatorPattern;

/**
 * 通用抽象中介者
 */
public abstract class Mediator {

	// 定义同事类
	protected ConcreteColleage1 colleage1;
	protected ConcreteColleage2 colleage2;
	
	// 中介者模式的业务逻辑(依赖关系复杂的)
	public abstract void doSomething1();
	public abstract void doSomething2();
	
	public ConcreteColleage1 getColleage1() {
		return colleage1;
	}
	public void setColleage1(ConcreteColleage1 colleage1) {
		this.colleage1 = colleage1;
	}
	public ConcreteColleage2 getColleage2() {
		return colleage2;
	}
	public void setColleage2(ConcreteColleage2 colleage2) {
		this.colleage2 = colleage2;
	}
}
 
package _8MediatorPattern;

/**
 * 中介者具体类
 */
public class ConcreteMediator extends Mediator {

	@Override
	public void doSomething1() {
		super.colleage1.selfMethod1();
		// 依赖方法
		super.colleage2.depMethod2();
	}

	@Override
	public void doSomething2() {
		// 依赖方法
		super.colleage1.depMethod1();
		super.colleage2.selfMethod2();
	}
}
 
package _8MediatorPattern;

/**
 * 抽象同事类
 */
public abstract class Colleage {

	protected Mediator mediator;
	public Colleage(Mediator mediator)
	{
		this.mediator = mediator;
	}
}
 
package _8MediatorPattern;

/**
 * 同事类1
 */
public class ConcreteColleage1 extends Colleage {

	// 通过构造函数传递中介者
	public ConcreteColleage1(Mediator mediator) {
		super(mediator);
	}

	// 自有方法 self-method
	public void selfMethod1()
	{
		
	}
	
	// 依赖方法 dep-method
	public void depMethod1()
	{
		super.mediator.doSomething1();
	}
	
}
 
package _8MediatorPattern;

/**
 * 同事类2
 */
public class ConcreteColleage2 extends Colleage {

	// 通过构造函数传递中介者
	public ConcreteColleage2(Mediator mediator) {
		super(mediator);
	}

	// 自有方法 self-method
	public void selfMethod2()
	{
		
	}
	
	// 依赖方法 dep-method
	public void depMethod2()
	{
		super.mediator.doSomething2();
	}
	
}

 

5.中介者模式的使用场景:

中介者模式适用于多个对象之间紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。在这种情况下一定要考虑使用中介者模式,这有利于把蜘蛛网梳理为星型结构,使原本复杂混乱的关系变得清晰简单。

中介者模式虽然简单,但不代表易用。在OOP中对象必然会存在依赖关系,中介者模式未必能把原来凌乱的逻辑整理的清清楚楚,而且中介者模式也是有缺点的,使用不当,缺点会被无限放大。

 

6.中介者模式的优点:

中介者模式的优点就是减少类间的依赖,把原本的一对多依赖编程了一对一依赖,同事类只依赖中介者,减少了依赖,同事也降低了类间的耦合。

 

7.中介者模式的缺点:

中介者模式的缺点是中介者会膨胀的很大,而且逻辑复杂,原本N个对象直接相互依赖的关系转换成了中介者和同事类的依赖关系,同事类越多,中介者的逻辑越复杂。

 

8.中介者模式的实际应用:

  • 机场的调度中心
  • MVC框架中的Controller
  • 媒体网关,比如QQ的聊天服务器
  • 中介服务,比如房产中介
分享到:
评论

相关推荐

    设计模式之中介者模式(Mediator Pattern)

    **设计模式之中介者模式(Mediator Pattern)** 在软件工程中,设计模式是一种解决常见问题的经验总结,它提供了一种可复用的解决方案。中介者模式是行为设计模式之一,其主要目的是降低多个对象之间的复杂性,通过...

    C#设计模式_设计模式_C#_

    中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    中介者模式(Mediator Pattern)原理图

    中介者模式(Mediator Pattern)是一种行为型设计模式,用于减少对象之间的直接相互依赖,使得对象间的交互通过一个中介者对象来进行协调。在中介者模式中,对象之间不再直接相互调用,而是通过中介者对象来传递消息...

    23种设计模式 (创建型,结构型,行为型)

    中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式...

    设计模式代码——c#

    18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式...

    32种设计模式

    中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23...

    java常用设计模式-中介者模式

    中介者模式(Mediator Pattern)是一种行为设计模式,它允许对象之间通过中介者对象进行通信,从而避免对象之间的直接耦合。中介者模式将对象之间的复杂关系转化为中介者和对象之间的简单关系,从而提高了系统的灵活...

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式

    标题和描述均提到了"C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式",这明确指向了一个特定的设计模式——中介者模式(Mediator Pattern),并且是在C#语言环境下的应用。下面将详细阐述这一设计...

    设计模式 - 中介者模式(C++实例)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,它定义了一个用来封装一系列对象交互的接口。在软件工程中,当多个对象之间存在复杂的相互依赖关系时,这种模式可以帮助我们降低系统的耦合度,使得各个对象...

    C#23种设计模式【完整】.pdf

    16. 中介者模式(Mediator Pattern):定义一个中介对象来封装一组对象之间的交互,使得对象之间的交互更加松散。 17. 职责链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求的...

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 (Level 300)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,其主要目的是降低多个对象之间的通信复杂性,将这些对象的直接交互转化为与一个中心对象——中介者的交互。在C#中,中介者模式的应用能够有效地减少类之间的...

    Java设计模式之禅

    8. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。 行为型模式关注的是对象之间的通信,包括: 1. 模板方法模式(Template Method Pattern):在一个方法中定义一个算法的骨架,而将一些...

    Java 23种设计模式21中介者模式.pdf

    中介者模式(Mediator Pattern)是一种行为设计模式,用于封装一组对象间的交互。通过中介者对象,各对象不需要直接引用彼此,而是通过中介者进行间接通信,从而实现了对象间的松耦合。这一模式不仅简化了对象之间的...

    C# 24种设计模式代码示例

    16. 中介者模式(Mediator Pattern):定义一个中介对象来简化原本复杂的对象交互。 17. 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获和恢复对象的状态。 18. 观察者模式(Observer Pattern):...

    PHP设计模式之中介者模式(Mediator Pattern)入门与应用案例详解

    咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,这种模式又称为调停...

    [行为型模式] 中介者模式的理解

    在`MediatorPattern.cpp`和`MediatorPattern.h`这两个文件中,我们可以预期看到中介者模式的具体实现。`MediatorPattern.h`可能包含了中介者和同事类的定义,而`MediatorPattern.cpp`则实现了这些类的成员函数。 ...

    Java的23种设计模式

    10. 中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互。 11. 备忘录模式(Memento Pattern):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 12. 状态模式...

    CC++与设计模式讲义.pdf

    17. 中介者模式(Mediator Pattern),通过一个中介对象来封装一系列对象之间的交互。 此外,文件中也提到学习设计模式的方法,比如对于初学者来说,积累案例比背诵类图更为重要,对于开发者,建议多思考和归纳总结...

    mediator模式

    **中介者模式(Mediator Pattern)** 中介者模式是一种行为设计模式,它的主要目标是减少对象之间的耦合性,通过引入一个中介对象来协调多个对象之间的交互。在传统的多对象交互场景中,对象之间可能存在复杂的依赖...

    C#23种设计模式【完整】(亲测可用)

    21. 中介者模式(Mediator Pattern):定义一个中介对象来简化原本复杂的对象交互。 22. 组合实体模式(Composite Entity Pattern):用于处理对象的组件和组合结构,使用户可以忽略它们之间的差异。 23. 备忘录...

Global site tag (gtag.js) - Google Analytics