中介者模式

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

就是说我们需要传递两个对象之间的消息时,比如说A对象必须知道B对象的消息,然后做出响应。一般的解决办法就是将这两个对象都写到一个类里,由这个类来接收B对象的信息,然后用if else来判断A对象该怎么执行。
中介者模式提供了一种方法,A和B各自不需要知道,只需要将消息发给一个中介者类,由中介者来调用相应类来处理。这样就将交互过程都写到中介者中,降低了AB的耦合。
但是中介者必须知道AB对象,中介者模式使中介者变得非常复杂。

我们先声明联合国这个中介者接口

public interface IUnitNation {
    void declare(String message, Country country);
}

然后还有国家的接口,可以看出,国家必须知道要向联合国提交申请和消息

public abstract class Country {
    protected IUnitNation unitNation;
    public Country(IUnitNation unitNation) {
        this.unitNation = unitNation;
    }
    public abstract void declare(String message);

    public abstract void getMessage(String message);
}
public class USA extends Country {
    public USA(IUnitNation unitNation) {
        super(unitNation);
    }

    @Override
    public void declare(String message) {
        unitNation.declare(message, this);
    }

    @Override
    public void getMessage(String message) {
        System.out.println("USA 获得消息:" + message);
    }
}
public class Iraq extends Country {
    public Iraq(IUnitNation unitNation) {
        super(unitNation);
    }

    @Override
    public void declare(String message) {
        unitNation.declare(message, this);
    }

    @Override
    public void getMessage(String message) {
        System.out.println("Iraq 获得消息:" + message);
    }
}

安理会是具体联合国组织,它必须知道每个国家,并对传达它们之间的消息

public class UnitedNationSecurityCouncil implements IUnitNation {
    private USA usa;
    private Iraq iraq;

    public void setUSA(USA usa) {
        this.usa = usa;
    }

    public void setIraq(Iraq iraq) {
        this.iraq = iraq;
    }

    @Override
    public void declare(String message, Country country) {
        if (usa == country) {
            iraq.getMessage(message);
        }
        else {
            usa.getMessage(message);
        }
    }
}

最后看主程序:

UnitedNationSecurityCouncil UNSC = new UnitedNationSecurityCouncil();
USA usa = new USA(UNSC);
Iraq iraq = new Iraq(UNSC);

UNSC.setUSA(usa);
UNSC.setIraq(iraq);

usa.declare("我要干掉你!");
iraq.declare("who 怕 who!");

每个国家必须在安理会设置代表:USA usa = new USA(UNSC);
Iraq iraq = new Iraq(UNSC);
安理会也必须设置这些国家的理事国地位:UNSC.setUSA(usa);
UNSC.setIraq(iraq);
然后才能有能力在它们之间传递消息
结果:

Iraq 获得消息:我要干掉你!
USA 获得消息:who 怕 who!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值