23种设计模式-java-中介者

模式概述

让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

使用场景

1.当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
2.当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
3.如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

代码样例

代码背景: 一个公司,有研发、行政、财务、市场、后勤等部门;比如发工资,需要财务部门给每个部门发,那么需要在财务部门添加每个部门的引用;在比如研发部门进行请假需要行政部门进行审批,还需要财务部门进行扣款,那么研发部门需要添加行政部门和财务部门的引用;部门之间依赖关系复杂错乱,耦合度也高,为了解决这种问题,使用中介者来处理;所有部门之间不在直接进行交互,而是统一通过中介者来交互,每个部门中不必在存放多个可能用到的其他部门的引用,只需要存放一个中介者的引用即可;应用方面,进行初始化一个具体中介者,并把需要的部门注册到中介者中。以下是以请假为例的中介者代码:

/**
 * 部门基类
 */
public abstract class Department {
    public String deartmentName;

    public String getDeartmentName(){
        return deartmentName;
    }

    public abstract void setMediator(Mediator mediator);
}

/**
 * 研发部门
 */
public class DevelopDepartMent extends Department{
    private Mediator mediator;

    public DevelopDepartMent(){
        deartmentName = "developp";
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    /**
     * 研发部门的能力之一
     */
    public void createProduct(){
        System.out.println("研发部门生产了一个产品。。。");
    }


}
/**
 * 行政部门
 */
public class AdminDepartment extends Department{
    private Mediator mediator;

    public AdminDepartment(){
        deartmentName="admin";
    }

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

    /**
     * 行政部门能力之一
     */
    public void audit(){
        System.out.println("审批了一个任务。。。");
    }
}
/**
 * 财务部门
 */
public class FinanceDepartment extends Department{

    private Mediator mediator;

    public FinanceDepartment(){
        deartmentName = "finance";
    }

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

    /**
     * 行政部门的能力之一
     */
    public void giveMoney(long money){
        System.out.println("进行了一次拨款,拨款数额为:"+money);
    }
}
/**
 * 中介者
 */
public interface Mediator {

    //注册组件;具体的中介者把各个组件注册到中介者中,并把组件中的中介者设置为当前的具体中介者
    void registerComponent(Department department);

    //请假
    void leave();
}
/**
 * 具体的一个中介者
 */
public class MediatorImpl1  implements Mediator{
    private DevelopDepartMent developDepartMent;
    private AdminDepartment adminDepartment;
    private FinanceDepartment financeDepartment;

    @Override
    public void registerComponent(Department department) {
        department.setMediator(this);
        switch (department.getDeartmentName()){
            case "developp":
                developDepartMent = (DevelopDepartMent) department;
                break;
            case "admin":
                adminDepartment = (AdminDepartment) department;
                break;
            case "finance":
                financeDepartment = (FinanceDepartment) department;
                break;
        }

    }

    /**
     * 请假
     * 需要行政部门审批,财务部门扣款
     */
    public void leave(){
        adminDepartment.audit();
        financeDepartment.giveMoney(-200l);
    }
public class TestMediator {
    public static void main(String[] args) {
        Mediator mediator = new MediatorImpl1();

        //所有部门解耦,把所有部门都注册到中介者中
        mediator.registerComponent(new DevelopDepartMent());
        mediator.registerComponent(new AdminDepartment());
        mediator.registerComponent(new FinanceDepartment());

        mediator.leave();
    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值