设计模式——中介者模式

什么是中介者模式

如果我们想让两个对象之间进行通信,一种方法是让对象互相持有对方的引用,在需要的时候将消息通过引用传递给对方,这种方式在需要通信的对象不多的时候不会有问题,当通信的对象数目增多时,一个对象持有的引用就会非常多,为了克服这种问题,就用一个类(中介者)专门负责对象之间的交互,所有的对象都通过中介者进行通信

 

中介者模式的角色

Mediator:抽象中介者角色,需要定义对象交互信息的方法

ConcreteMediator:具体中介者角色,实现具体的交互信息的方法

Colleague:抽象同事类角色,定义向中介者提交请求的接口

ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类

../_images/Mediator.jpg

 

实例:A与B之间进行实时通信

 

Mediator:

public abstract class Mediator {  
    
    protected User_A A;
    protected User_B B;
    
    public Mediator(User_A A,User_B B){
        this.A=A;
        this.B=B;
    }
    
    public abstract void notifyA(String message);  
    public abstract void notifyB(String message);
}

 

User(colleague):

public abstract class User {
    public Mediator mediator;
    
    public abstract void setMediator(Mediator mediator);
    
    public abstract void reciveMessage(String message);
    public abstract void sendMessage(String message);
}

 

User_A:

public class User_A extends User{
    
    public void setMediator(Mediator mediator){
        super.mediator=mediator;
    }
    
    
    public void reciveMessage(String message) {
        System.out.println("A接收到B的消息:"+message);
    }

    public void sendMessage(String message) {
        mediator.notifyB(message);
    }
    
    
}

 

User_B:

public class User_B extends User{
    
    @Override
    public void reciveMessage(String message) {
        System.out.println("B接收到A的消息:"+message);
    }

    @Override
    public void sendMessage(String message) {
       mediator.notifyA(message);
    }

    @Override
    public void setMediator(Mediator mediator) {
        super.mediator=mediator;
    }
    
}

 

ConcreteMediator:

public class ConcreteMediator extends Mediator{

    public ConcreteMediator(User_A A, User_B B) {
        super(A, B);
    }

    @Override
    public void notifyA(String message) {
        A.reciveMessage(message);
    }

    @Override
    public void notifyB(String message) {
        B.reciveMessage(message);
    }
    
}

 

main:

public class main {
    
    public static void main(String[] args){
       User_A A=new User_A();
       User_B B=new User_B();
       
       Mediator mediator=new ConcreteMediator(A,B);
       A.setMediator(mediator);
       B.setMediator(mediator);
       
       A.sendMessage("学车教练有点烦耶");
       B.sendMessage("我也觉得是");
    } 
    
}

 

效果图:

 

中介者模式的一点思考

中介者模式使对象之间是松耦合的,当对象与对象之间的关系比较混乱的时候才使用中介者模式,当对象多起来后,中介者本身的代码量可能会变得非常巨大,在构造中介者模式时,需要注意一点,因为具体同事类持有抽象中介者类的应用,抽象中介者持有同事类的引用,所以不要在构造函数中初始化引用,这样会陷入无法初始化一个类的尴尬情况(就和spring中的循环注入一样)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值