设计模式之---中介者模式(Mediator Design Pattern)

场景
买房租房找中介,男女相亲找中介。
用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其韧合松散,而且可以独立地改变它们之间的交互。
简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加人一个‘中介’对象,使得两头的对象分别和‘中介’,对象引用或者依赖。

意图
1、使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。
2、这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!

组成部分
1、抽象中介者角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2、具体中介者角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3、同事角色:每一个同事角色都知道对应的具体中介者角色.而且与其他的同事角色通信的时候,一定要通过中介者角色协作。

应用场景

1、一组对象以定义良好但是复杂的方式进行通信,产生了混乱的依赖关系,也导致对象难以复用。
2、中介者模式很容易在系统中应用,也很容易在系统中误用。
3、当系统出现了‘多对多’交互复杂的对象群,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

应用实例
1.男女相亲约会:
1.明确,男人和女人如果约会,假设男方提出约会(女方提出过程类似).如果没有媒人,该过程如下:
a)男方如果想和女方约会,男方
b)首先请示自己的父母(^_^,假设是封建家庭哦…),
c)然后通知女方
d)女方需要请示女方父母.是否同意约会.

弊端:
需要男方交换的对象太多,
且关系复杂,
当随着男女之间的交往的复杂,
会涉及到更多复杂的交换,
双方父母的交换也很更复杂,
使得四个对象(男,女,男方家长,女方家长)关系复杂.
难以控制.

2.模式改进:
采取媒人做“中介者“模式,将变得简单:
其中无论那一个人有什么要求,请求,
只需要告诉“媒人“,
至于该请求需要告诉谁,
和谁交换,
只有媒人知道。

1. 男方类

public class Man {
    private Matchmaker mat; // 媒人

    public Man(Matchmaker mat) {
        this.mat = mat;
        mat.registeMan(this);//把自己在媒人那里注册(声明)
    }

    public static void main(String[] args) {
    }

    /**
     * 考虑是否同意
     *
     * @return
     */
    public boolean thinking(String says) {

        System.out.println("男人考虑:我该不该同意呢???");
        if (says.length() > 5) {
            System.out.println("我同意了");
            return true;
        } else {
            System.out.println("我不同意.");
            return false;
        }
    }

    /**
     * 提出约会
     * 男人提出约会,只需要告诉媒人,由媒人负责跟其他人交互.
     *
     * @param says
     */
    public void tryst(String says) {
        System.out.println("男人提出约会请求,说:" + says);
        mat.doManTryst(says);
    }
}

2. 男方家长类


public class ManParent {
    private Matchmaker mat; //媒人类

    public ManParent(Matchmaker mat) {
        this.mat = mat;
        mat.registeManParent(this); //把自己在媒人那里注册(声明)
    }

    public static void main(String[] args) {
        //ManParent manParent1 = new ManParent();
    }

    /**
     * 考虑是否同意
     *
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("男方父母考虑:我们做父母的该不该同意呢???");
        if (says.length() > 5) {
            System.out.println("我们做父母的同意了");
            return true;
        } else {
            System.out.println("我们做父母的不同意.");
            return false;
        }

    }
}

3.女方类

public class Woman {
    private Matchmaker mat; // 媒人

    public Woman(Matchmaker mat) {
        this.mat = mat;
        mat.registeWoman(this); //把自己在媒人那里注册(声明)
    }

    public static void main(String[] args) {

    }

    /**
     * 考虑是否同意
     *
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("女人考虑:我该不该同意呢???");
        if (says.length() > 5) {
            System.out.println("我同意了");
            return true;
        } else {
            System.out.println("我不同意.");
            return false;
        }

    }

    /**
     * 提出约会
     * 女人提出约会,只需要告诉媒人,由媒人负责跟其他人交互.
     *
     * @param says
     */
    public void tryst(String says) {
        System.out.println("女人提出约会请求,说:" + says);
        mat.doWomanTryst(says);
    }
}

4.女方家长类

public class WomanParent {
    private Matchmaker mat; //媒人类
    public WomanParent(Matchmaker mat) {
        this.mat=mat;
        mat.registerWomanParent(this); //把自己在媒人那里注册(声明)
    }
    public static void main(String[] args) {
        //WomanParent womanParent1 = new WomanParent();
    }

    /**
     *考虑是否同意
     * @return
     */
    public boolean thinking(String says) {
        System.out.println("女方父母考虑:我们做父母的该不该同意呢???");
        if (says.length() > 5){
            System.out.println("我们做父母的同意了");
            return true;
        }
        else{
            System.out.println("我们做父母的不同意.");
            return false;
        }
    }
}

5.测试类

public class MatchmakerDemo {
    public MatchmakerDemo() {
    }
    public static void main(String[] args) {
        MatchmakerDemo matchmakerDemo1 = new MatchmakerDemo();
        Matchmaker mat = new Matchmaker(); //媒人出现
        Man man = new Man(mat);//男人,以媒人为建立构造参数
        Woman woman=new Woman(mat);
        ManParent manp=new ManParent(mat);
        WomanParent womanp=new WomanParent(mat);        
        System.out.println("===========================");                                             
        man.tryst("我想和你约会,可以吗?");
        System.out.println("===========================");
        woman.tryst("想和你约会");
    }
}

输出结果如下:

===========================
男人提出约会请求,说:我想和你约会,可以吗?
媒人开始处理约会问题开始
女人考虑:我该不该同意呢???
我同意了
男方父母考虑:我们做父母的该不该同意呢???
我们做父母的同意了
女方父母考虑:我们做父母的该不该同意呢???
我们做父母的同意了
媒人处理约会问题结束,根据同意的结果做其他处理
===========================
女人提出约会请求,说:想和你约会
媒人开始处理约会问题开始
男人考虑:我该不该同意呢???
我不同意.
男方父母考虑:我们做父母的该不该同意呢???
我们做父母的不同意.
女方父母考虑:我们做父母的该不该同意呢???
我们做父母的不同意.
媒人处理约会问题结束,根据同意的结果做其他处理
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值