设计模式-22.中介者模式

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

使用场景:一堆类需要相互通信构造蜘蛛网结构时,就需要使用中介者降低耦合

实现:定义中介者类,包含通信对象的实例,声明通信方法。定义通信对象抽象类,包含一个中介者类实例,声明通信方法,方法中调用中介者的通信方法,传参为消息+自己的引用。

优点:解耦通信者

缺点:中介者的类会变得很复杂

代码示例:联合国就是各个国家之间的中介

/**
 * 联合国
 */
public class UnitedNations {
    private Country country1;
    
    private Country country2;
    
    public Country getCountry1() {
        return country1;
    }

    public void setCountry1(Country country1) {
        this.country1 = country1;
    }

    public Country getCountry2() {
        return country2;
    }

    public void setCountry2(Country country2) {
        this.country2 = country2;
    }

    public void forward(Country country,String message) {
        if (country == country1) {
            country2.getMessage(message);
        }else {
            country1.getMessage(message);
        }
    }
}

public abstract class Country {
    protected UnitedNations unitedNations;

    public Country(UnitedNations unitedNations) {
        super();
        this.unitedNations = unitedNations;
    }
    
    public abstract void send(String message);
    
    public abstract void getMessage(String message);
}

public class China extends Country {

    public China(UnitedNations unitedNations) {
        super(unitedNations);
    }
    

    @Override
    public void send(String message) {
        this.unitedNations.forward(this, message);
    }
    @Override
    public void getMessage(String message) {
        System.out.println("china收到消息:"+message);
    }
}

public class USA extends Country {

    public USA(UnitedNations unitedNations) {
        super(unitedNations);
    }

    @Override
    public void send(String message) {
        this.unitedNations.forward(this, message);
    }

    @Override
    public void getMessage(String message) {
        System.out.println("usa收到消息:"+message);
    }

}

public class Main {

    public static void main(String[] args) {
        
        UnitedNations unitedNations = new UnitedNations();
        China china = new China(unitedNations);
        USA usa = new USA(unitedNations);
        unitedNations.setCountry1(china);
        unitedNations.setCountry2(usa);
        
        china.send("老实点");
        usa.send("好嘞");
    }

}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值