在面向对象的设计模式中,对象之间难免会有一些交互,复杂的对象之间的交互会形成一个网状的关系模式,这样的势必会形成一个高度耦合的系统,中介者模式就是用来解决这个问题,使网状的关系模式变成一个星形的模式。中介者模式类似于我们计算机中的交换机的作用,把计算机直接的通信通过交换机来完成。
中介者模式的定义:用一个对象来封装一些交互方法,使别的需要交互的类通过封装的交互方法实现彼此的交互。
中介者模式含有如下3中角色:
抽象中介者:定义一些抽象的交互方法,让实现类去实现具体的逻辑。
抽象中介继承者:实现抽象中介者,重写里面的抽象方法,实现具体的同事类之间的交互。
抽象同事对象:同事类的抽象表现形式。
同事类:有联系的两个类之间成为同事类,这个是需要解决问题的根源。
概念很简单,也很容易理解,只是用文字去描述感觉是懂了可是真的使用的时候可能会无从下手,下面我们就用具体的例子来看看这个模式到底该如何去使用。这次我们就使用生活中的一个例子,假设现在有A、B、C三个同学住在一块,每天他们都要各自去公司上班,晚上下班回来的时候他们会一起吃饭,叫的外卖,可是上班又会经常遇到加班或者别的临时有事的问题,所以他们每天订饭前都会问彼此回不回来吃饭,好决定订几个人的饭,今天假设是A同学订外卖,它就要问B、C同学回不回来吃饭,这样它就要问两次,那么如果有一个qq讨论组,3个同学都在这个讨论组里面,A同学只要在讨论组里问一声就可以了,不必要直接去和B、C同学打交道,省去了很多麻烦事。下面我们就以这个例子写代码。
首先是我们的抽象中介者,他应该是我们的工具IMUtils,代码如下:
~~~
public abstract class IMUtils {
public abstract void transmit(Person person,String msg);
}
~~~
只有一个消息传达类,下面来看具体的中介者QQGroup,代码如下:
~~~
public class QQGroup extends IMUtils {
@Override
public synchronized void transmit(Person person, String msg) {
if (person instanceof A) {
B b = B.getInstance();
C c = C.getInstance();
c.hear(person, msg);
b.hear(person, msg);
} else if (person instanceof B) {
A a = A.getInstance();
a.hear(person, msg);
C c = C.getInstance();
c.hear(person, msg);
} else {
A a = A.getInstance();
a.hear(person, msg);
B b = B.getInstance();
b.hear(person, msg);
}
}
}
~~~
他把收到的消息转发给除了发送者以外的所有人,调用人的听消息方法。那么人有哪些方法呢?我们来看抽象的同事类---抽象的人类,代码如下:
~~~
public abstract class Person {
public String isEating;
public abstract void speak(String msg);
public abstract void hear(Person person, String msg);
}
~~~
里面有一个听和说的方法,还有一个变量用来表示自己是否需要订外卖,下面我们来看具体的人类A,也就是具体定外卖的那个角色,代码如下:
~~~
public class A extends Person {
private int count = 1;
private volatile static A a;
private A() {
}
public static A getInstance() {
if (null == a) {
synchronized (A.class) {
if (null == a) {
a = new A();
}
}
}
return a;
}
@Override
public void speak(String msg) {
new QQGroup().transmit(this, msg);
}
@Override
public void hear(Person person, String msg) {
if (msg == "yes") {
if (person instanceof B) {
Log.e("我来一份--->", "B");
count++;
} else if (person instanceof C) {
Log.e("我来一份--->", "C");
count++;
}
Log.e("订饭的人数:", count + "");
}
}
}
~~~
这里我们使用了单例模式来创建人,保证一个A的唯一性,当人要说话的时候调用QQGroup的transmit方法把消息传过去,当听到消息的时候判断是否听到了yes,如果是就多订一份,默认情况下自己是需要一份的,所以用来记录盒饭数量的count默认是1,如果自己不吃只需要把变量改了0就可以了。因为B和C的代码是类似的,我们这里只贴出B的代码了,代码如下:
~~~
public class B extends Person {
private B() {
}
private static volatile B b;
public static B getInstance() {
if (null == b) {
synchronized (B.class) {
if (null == b) {
b = new B();
}
}
}
return b;
}
@Override
public void speak(String msg) {
new QQGroup().transmit(this, msg);
}
@Override
public void hear(Person person, String msg) {
if (msg == "你们要吃饭吗?") {
speak(isEating = "yes");
}
}
}
~~~
也是使用单例模式,在hear方法中如果听见是问是否吃饭,就发送消息出去,告诉A它自己是需要一份外卖的,最后来看下Activity代码,Activity里面只有一个按钮,点击按钮的时候调用sendMSG方法,该方法里面的代码如下:
~~~
public void sendMSG(View view) {
A a = A.getInstance();
a.speak("你们要吃饭吗?");
}
~~~
**总结:**
中介者模式其实在实际中用的不是很多,如果类的关系不是很复杂建议还是不要使用,因为这个模式很容易用错了,而且如果类简单使用中介模式反而会增加代码,也会是app变得更加复杂,当然你了解了这个模式之后相信在以后的开发中一定可以用到这个模式,希望今天的课对你有所帮助。ok,今天就到这里,如果想学到更多设计模式的相关知识欢迎关注我的博客,如果你想转载本篇文章,希望你注明文章的出处:http://blog.csdn.net/qq379454816,最后送上我练习的demo:[demo](http://download.csdn.net/detail/qq379454816/9384240)