`

3. 行为型模式 (10) 中介者模式

阅读更多
3. 行为型模式 (10) 中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。

提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

优点:
1. 降低了类的复杂度,将一对多转化成了一对一。
2. 各个类之间的解耦。
3. 符合迪米特原则。

缺点:
1. 中介者会庞大,变得复杂难以维护。


1. 中介者模式

package com.andrew.pattern0310.mediator.model01;
import java.util.Date;
public class ChatRoom {
    public static void showMessage(User user, String message) {
        System.out.println(new Date().toString() + " [" + user.getName() +"] : " + message);
    }
}


package com.andrew.pattern0310.mediator.model01;
public class User {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User(String name) {
        this.name  = name;
    }
    public void sendMessage(String message) {
        ChatRoom.showMessage(this,message);
    }
}


package com.andrew.pattern0310.mediator.model01;
/**
 * 1. 中介者模式
 * 
 * @author andrew
 * @date 2018/11/08
 */
public class Client {
    public static void main(String[] args) {
        User robert = new User("Robert");
        User john = new User("John");
        robert.sendMessage("Hi! John!");
        john.sendMessage("Hello! Robert!");
    }
}
运行结果:
Thu Nov 08 09:14:09 CST 2018 [Robert] : Hi! John!
Thu Nov 08 09:14:09 CST 2018 [John] : Hello! Robert!


角色:
1. 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
2. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。
3. 同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。


2. 中介者模式

package com.andrew.pattern0310.mediator.model02;
public abstract class AbstractColleague {
    protected int number;
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public abstract void setNumber(int number, AbstractMediator am);
}

package com.andrew.pattern0310.mediator.model02;
public class ColleagueA extends AbstractColleague {
    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.AaffectB();
    }
}

package com.andrew.pattern0310.mediator.model02;
public class ColleagueB extends AbstractColleague {
    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.BaffectA();
    }
}


package com.andrew.pattern0310.mediator.model02;
public abstract class AbstractMediator {
    protected AbstractColleague A;
    protected AbstractColleague B;
    public AbstractMediator(AbstractColleague a, AbstractColleague b) {
        A = a;
        B = b;
    }
    public abstract void AaffectB();
    public abstract void BaffectA();
}


package com.andrew.pattern0310.mediator.model02;
public class Mediator extends AbstractMediator {
    public Mediator(AbstractColleague a, AbstractColleague b) {
        super(a, b);
    }
    @Override
    public void AaffectB() {
        int number = A.getNumber();
        B.setNumber(number*100);
    }
    @Override
    public void BaffectA() {
        int number = B.getNumber();
        A.setNumber(number/100);
    }
}


package com.andrew.pattern0310.mediator.model02;
/**
 * 2. 中介者模式
 * 
 * @author andrew
 * @date 2018/11/08
 */
public class Client {
    public static void main(String[] args) {
        AbstractColleague collA = new ColleagueA();
        AbstractColleague collB = new ColleagueB();
        AbstractMediator am = new Mediator(collA, collB);
        System.out.println("==========通过设置A影响B==========");
        collA.setNumber(1000, am);
        System.out.println("collA的number值为:"+collA.getNumber());
        System.out.println("collB的number值为A的10倍:"+collB.getNumber());
        System.out.println("==========通过设置B影响A==========");
        collB.setNumber(1000, am);
        System.out.println("collB的number值为:"+collB.getNumber());
        System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());
    }
}
运行结果:
==========通过设置A影响B==========
collA的number值为:1000
collB的number值为A的10倍:100000
==========通过设置B影响A==========
collB的number值为:1000
collA的number值为B的0.1倍:10
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics