Java设计模式-中介者模式

19、中介者模式

中介模式的设计思想跟中间层很像,通过引⼊中介这个中间层,将⼀组对象之间的交互关系 (或者依赖关系)从多对多(⽹状关系)转换为⼀对多(星状关系)。原来⼀个对象要跟 n 个对象交互,现在只需要跟⼀个中介对象交互,从⽽最⼩化对象之间的交互关系,降低了代码 的复杂度,提⾼了代码的可读性和可维护性。

UML类图:

在这里插入图片描述

**抽象中介者:**定义了各个同事之间交互需要的方法。

**具体中介者:**需要了解维护各个同事对象,并且负责协调各个具体同事之间的交互。

**抽象同事类:**约束具体同事类的类型、并且实现一些具体同事类之间的公共方法。

**具体同事类:**实现自己的业务。

具体示例:有六个房东需要出租房屋,房屋各不相同、各有各的特点、适合不一样的人租住。这六个房东之间刚好有点联系。然后都在出租房屋。这时租客A来租房,看了一号房东的房子不满意、但是一号房东觉得可以让他去看看其他五个朋友的房间。然后开始联系他的五个朋友。这样运行下去好像有是没有什么问题的。但是其中二号房东如果房屋不出租或者出租出去了。也就是发生了变化。二号房东则需要通知其他五个朋友,告诉他们不用再给他介绍租客了。这里就造成了中间一个人发生了变化,需要改动其他五个人。那么如何可以解决这种情况呢。我们回到现在。把中介加进来、那六个房东都把房屋交给中介处理。租客A看房间一不满意直接通过中介看房间二。当房间二被租客A看中了。中介也只需要通知房东二号、然后他们签订合同。下次还有人看房间就不会再看房间二了。这里一个出现了变化也就影响改变了一个。并不会影响其他另外五个房东。

不采用中介的房东租房模式,多对多的网格。一动牵全身:如下图

在这里插入图片描述

采用中介的租房模式,一对多、一个变动不影响其他,如下图:

在这里插入图片描述

具体案例的UML类图:

在这里插入图片描述

具体案例的中介模式代码实现:

//抽象同事类
public abstract class Colleague {
    //处理自己的事务(房东展示自己的房屋)
    public abstract void Handle();
}

//房东(小房间)
public class SmallHouseColleague extends Colleague {

    @Override
    public void Handle() {
        System.out.println("单间--便宜");
    }
}

//房东(两居室)
public class TwoHouseColleague extends Colleague {
    @Override
    public void Handle() {
        System.out.println("两居室--靠谱");
    }
}

//房东(三居室)
public class ThreeHouseColleague extends Colleague {
    @Override
    public void Handle() {
        System.out.println("三居室--有钱人");
    }
}

//抽象中介类
public abstract class Mediator {
    public abstract void common(String type);
}

//房屋中介
public class HouseMediator extends Mediator {
    //中介所有房东的房屋信息
    private SmallHouseColleague smallHouseColleague;
    private TwoHouseColleague twoHouseColleague;
    private ThreeHouseColleague threeHouseColleague;

    @Override
    public void common(String type) {
        switch (type) {
            case "单间":
                if (smallHouseColleague != null) {
                    smallHouseColleague.Handle();
                    System.out.println("如果可以就可以租房了!");
                } else {
                    System.out.println(type + "暂时没有房源!");
                }
                break;
            case "两居室":
                if (twoHouseColleague != null) {
                    twoHouseColleague.Handle();
                    System.out.println("如果可以就可以租房了!");
                } else {
                    System.out.println(type + "暂时没有房源!");
                }
                break;
            case "三居室":
                if (threeHouseColleague != null) {
                    threeHouseColleague.Handle();
                    System.out.println("如果可以就可以租房了!");
                } else {
                    System.out.println(type + "暂时没有房源!");
                }
                break;
            default:
                System.out.println(type + "暂时没有房源!");
                break;
        }
    }

    //get和set方法。。。。。。
}

public class Test76 {
    public static void main(String[] args) {
        HouseMediator houseMediator = new HouseMediator();
        SmallHouseColleague smallHouseColleague = new SmallHouseColleague();
        TwoHouseColleague twoHouseColleague = new TwoHouseColleague();
        ThreeHouseColleague threeHouseColleague = new ThreeHouseColleague();

        houseMediator.setSmallHouseColleague(smallHouseColleague);
        houseMediator.setTwoHouseColleague(twoHouseColleague);
        houseMediator.setThreeHouseColleague(threeHouseColleague);

        houseMediator.common("单间");
        houseMediator.common("三居室");
        houseMediator.common("别墅");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值