Mediator中介者模式定义
Mediator 中介者,或者叫仲裁者,类似房屋的中介,比如演播室的主播和嘉宾,主播在说话的时候,嘉宾不能打断他,主播停止说话的时候嘉宾才能说话,主播则可以随时说话,这里还有一个中间人:
1.主播对中介者说,节目开始了,我要说话了
2.中介者看看嘉宾是不是在说话,如果是在说话,让他停止,让主播说,如果嘉宾没在说话,让主播说
3.嘉宾告诉中介者说我要说话,中介者看看主播是否在说话,如果在说话,就告诉嘉宾说主播在说,你等等再说;如果主播不在说话,则让嘉宾说
代码例子如下:
中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。
以上代码中只有两个参与者类,,但是这些我们都可以根据中介者模式的宗旨进行适当地扩展,即增加参与者类,然后中介者就得担负更加重的任务了,我们看到上面具体中介者类Mediator中的方法比较多而且有点乱。
所以,在解耦参与者类之间的联系的同时,中介者自身也不免任务过重,因为几乎所有的业务逻辑都交代到中介者身上了,可谓是“万众期待”的一个角色了。这就是中介者模式的不足之处了 。
此外,上面这个代码例子的参与者的属性和方法都是一样的,我们可以抽取一个抽象类出来,减少代码,但是有时候我们根本抽取不了多个“参与者”之间的共性来形成一个抽象类,这也大大增加了中介者模式的使用难度。
Mediator 中介者,或者叫仲裁者,类似房屋的中介,比如演播室的主播和嘉宾,主播在说话的时候,嘉宾不能打断他,主播停止说话的时候嘉宾才能说话,主播则可以随时说话,这里还有一个中间人:
1.主播对中介者说,节目开始了,我要说话了
2.中介者看看嘉宾是不是在说话,如果是在说话,让他停止,让主播说,如果嘉宾没在说话,让主播说
3.嘉宾告诉中介者说我要说话,中介者看看主播是否在说话,如果在说话,就告诉嘉宾说主播在说,你等等再说;如果主播不在说话,则让嘉宾说
代码例子如下:
- package mediator;
- /*
- * 中介者类,并和两个参与者进行关联,两个参与者在中介者这里注册
- */
- public class Mediator {
- private Anchor anchor;
- private Guest guest;
- public void regAnchor(Anchor anchor){
- this.anchor=anchor;
- }
- public void regGuest(Guest guest){
- this.guest=guest;
- }
- //中介代替主持人说话,如果嘉宾在说话,打断他,主持人说,主持人的状态变为忙碌
- public void anchorSpeak(){
- if(!guest.isFree()){
- guest.stop();
- }
- System.out.println("Anchor is speaking....");
- anchor.setFree(false);
- }
- //中介代替嘉宾说话,如果主持人空闲,嘉宾才能说话,嘉宾状态变为忙碌,
- //否则,不让嘉宾说话,主持人继续说
- public void guestSpeak(){
- if(anchor.isFree()){
- System.out.println("Guest is speaking....");
- guest.setFree(false);
- }
- else{
- System.out.println("Anchor is speaking. Do not interrupt...");
- }
- }
- //中介代替主持人停止说话,设置状态为空闲
- public void anchorStop(){
- System.out.println("Anchor stop speaking now....");
- anchor.setFree(true);
- }
- //中介代替嘉宾停止说话,设置状态为空闲
- public void guestStop(){
- System.out.println("Guest stop speaking now...");
- guest.setFree(true);
- }
- }
- package mediator;
- /*
- * 主持人类,有一个状态,是否处于空闲状态
- * 有一个终结者的私有属性,和中介者产生关系
- */
- public class Anchor {
- private boolean free;
- private Mediator med;
- public Anchor(Mediator md){
- med=md;
- }
- public boolean isFree() {
- return free;
- }
- public void setFree(boolean free) {
- this.free = free;
- }
- //通过中介者来开始说话
- public void speak() {
- med.anchorSpeak();
- }
- //通过中介者来停止说话
- public void stop() {
- med.anchorStop();
- }
- }
- package mediator;
- /*
- * 嘉宾类,私有属性标记是否空闲
- * 私有属性中介者,与中介者产生关系
- */
- public class Guest {
- private boolean free;
- private Mediator med;
- public Guest(Mediator md) {
- this.med = md;
- }
- public boolean isFree() {
- return free;
- }
- public void setFree(boolean free) {
- this.free = free;
- }
- //通过中介者开始说话
- public void speak() {
- med.guestSpeak();
- }
- //通过中介者停止说话
- public void stop() {
- med.guestStop();
- }
- }
- package mediator;
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- //新建一个中介者
- Mediator med = new Mediator();
- //新建一个主持人,并和中介者关联,让主持人知道中介都有什么能力(什么方法)
- Anchor anchor = new Anchor(med);
- //新建一个嘉宾,并和中介者关联,让嘉宾知道中介都能什么能力(什么方法)
- Guest guest=new Guest(med);
- //在中介者里面,注册主持人,和嘉宾,让中介者知道嘉宾和主持人都需要什么
- med.regAnchor(anchor);
- med.regGuest(guest);
- //主持人说
- anchor.speak();
- //嘉宾说
- guest.speak();
- //主持人停止
- anchor.stop();
- //嘉宾说
- guest.speak();
- //主持人说
- anchor.speak();
- }
- }
中介者就是一个处于众多对象,并恰当地处理众多对象之间相互之间的联系的角色。
以上代码中只有两个参与者类,,但是这些我们都可以根据中介者模式的宗旨进行适当地扩展,即增加参与者类,然后中介者就得担负更加重的任务了,我们看到上面具体中介者类Mediator中的方法比较多而且有点乱。
所以,在解耦参与者类之间的联系的同时,中介者自身也不免任务过重,因为几乎所有的业务逻辑都交代到中介者身上了,可谓是“万众期待”的一个角色了。这就是中介者模式的不足之处了 。
此外,上面这个代码例子的参与者的属性和方法都是一样的,我们可以抽取一个抽象类出来,减少代码,但是有时候我们根本抽取不了多个“参与者”之间的共性来形成一个抽象类,这也大大增加了中介者模式的使用难度。