字节跳动技术总监自爆:浅谈Mediator仲裁者模式

    setEnabled(enable);

}



@Override

public void itemStateChanged(ItemEvent e) {

    mediator.ColleagueChanged();

}

}




ColleagueTextField实现类



package designMode.mediator;

import java.awt.*;

import java.awt.event.TextEvent;

import java.awt.event.TextListener;

public class ColleagueTextField extends TextField implements TextListener,Colleague {

private static final long serialVersionUID = 8539124564669846422L;

public ColleagueTextField(String text,int columns){

    super(text,columns);

}

private Mediator mediator;

@Override

public void setMediator(Mediator mediator) {

    this.mediator=mediator;

}



@Override

public void setColleagueEnable(boolean enable) {

    setEnabled(enable);

    setBackground( enable? Color.WHITE : Color.BLACK );

}



@Override

public void textValueChanged(TextEvent e) {

    mediator.ColleagueChanged();

}

}




LoginFrame实现类



package designMode.mediator;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

public class LoginFrame extends Frame implements ActionListener, Mediator {

private static final long serialVersionUID = -509490729876024682L;



private ColleagueButton buttonOK;

private ColleagueButton buttonCancel;



private ColleagueCheckBox chkGuest;

private ColleagueCheckBox chkUser;



private ColleagueTextField tfUser;

private ColleagueTextField tfPass;



public LoginFrame(String title){

    super(title);

    setBackground(Color.lightGray);

    setLayout(new GridLayout(4,2));

    createColleagues();

    add(chkGuest);

    add(chkUser);

    add(new Label("用户名:"));

    add(tfUser);

    add(new Label("密码:"));

    add(tfPass);

    add(buttonOK);

    add(buttonCancel);

    ColleagueChanged();

    pack();

    show();

}



public void createColleagues() {

    CheckboxGroup chk=new CheckboxGroup();

    chkGuest=new ColleagueCheckBox("Guest",chk,true);

    chkUser=new ColleagueCheckBox("User",chk,false);

    buttonOK=new ColleagueButton("OK");

    buttonCancel=new ColleagueButton("Cancel");

    tfUser=new ColleagueTextField("",10);

    tfPass=new ColleagueTextField("",10);

    tfPass.setEchoChar('#');



    chkGuest.setMediator(this);

    chkUser.setMediator(this);

    buttonOK.setMediator(this);

    buttonCancel.setMediator(this);

    tfUser.setMediator(this);

    tfPass.setMediator(this);



    chkGuest.addItemListener(chkGuest);

    chkUser.addItemListener(chkUser);

    buttonOK.addActionListener(this);

    buttonCancel.addActionListener(this);

    tfUser.addTextListener(tfUser);

    tfPass.addTextListener(tfPass);



}



public void ColleagueChanged() {



    if(chkGuest.getState()){

        tfUser.setColleagueEnable(false);

        tfPass.setColleagueEnable(false);

        buttonOK.setColleagueEnable(true);

    }else{

        tfUser.setColleagueEnable(true);

        userPassChanged();

    }

}



private void userPassChanged() {

    if(tfUser.getText().length()>0){

        tfPass.setColleagueEnable(true);

        if(tfPass.getText().length()>0){

            buttonOK.setColleagueEnable(true);

        }else{

            buttonOK.setColleagueEnable(false);

        }

    }else{

        tfPass.setColleagueEnable(false);

        buttonOK.setColleagueEnable(false);

    }



}



public void actionPerformed(ActionEvent e) {

    System.out.println(e.toString());

    System.exit(0);

}

}




Main方法



package designMode.mediator;

public class Main {

public static void main(String[] args) {

    LoginFrame login = new LoginFrame("仲裁者模式");

}

}




运行结果



游客访问,不用输入用户名和密码,因此禁用。



![99f70158843e22bf9b8f3702abf8a6ee3f1.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0Lzk5ZjcwMTU4ODQzZTIyYmY5YjhmMzcwMmFiZjhhNmVlM2YxLmpwZw?x-oss-process=image/format,png)



会员访问,只有输入用户名之后才能输入密码,用户名可用,密码暂不能用,登录按钮OK不可用。



![475e9552442393df450a9595c4db279ad24.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0LzQ3NWU5NTUyNDQyMzkzZGY0NTBhOTU5NWM0ZGIyNzlhZDI0LmpwZw?x-oss-process=image/format,png)



会员访问,输入用户名和密码之后,登录按钮OK可用。



![e1851b6cabbc7d6e11ab5d8c462616245c1.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0L2UxODUxYjZjYWJiYzdkNmUxMWFiNWQ4YzQ2MjYxNjI0NWMxLmpwZw?x-oss-process=image/format,png)



点击登录按钮OK:



![8ce7e54bfc75f1f7184ca06d094da1fc1d1.jpg](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9vc2NpbWcub3NjaGluYS5uZXQvb3NjbmV0LzhjZTdlNTRiZmM3NWYxZjcxODRjYTA2ZDA5NGRhMWZjMWQxLmpwZw?x-oss-process=image/format,png)



分析:这些组件(按钮、文本框、单选框)每一个发生改变之后就要导致其他组件发生改变,比如用户名文本框改变,密码文本框也要响应改变,如果我们直接让这两个文本框之间产生交互,我们应该怎样写代码呢?我们可能在用户名文本框发生改变的函数中通知密码文本框,让密码文本框可用,那么我们需要得到密码文本框的对象,这必定是一件非常难以做到的事情,同样的,密码文本框的改变还要使得按钮发生改变,我们势必会将密码文本框和按钮之间再次建立联系(传递参数),这也是一件非常复杂的事情,同样的单选框发生改变,两个文本框和一个按钮都要发生改变,这又要在单选框之中得到这些组件的对象,然后才能改变这些组件的状态,但是单选框都有两个,来自于同一个类,我们要怎么识别呢,可能还要通过一定的方法得到单选框的ID,这是极其复杂的,最让人难以接受的是,如果需求发生了改变,比如又增加了一个控件,剩余的所有组件的代码都要修改,而这些代码之间本就混乱无比,再次修改就更让人难以接受了,因此这不是一个好的办法,甚至可以说是一个非常差的解决办法。



那么有什么好的解决办法吗?那就是将这些复杂的逻辑操作独立出来,新创建一个类,在每个空间的状态发生改变的时候就能通过某种方式通知这个类,让这个类改变这些控件的状态,这样说来这个新的类应该持有这些控件的引用,这样才能委托这些控件去改变自己的状态,同时这些控件要想通知这个新的类,那就要持有这个类的引用,这样才能委托新的类去实现所有状态的改变。这样我们的思路就清晰明了了,如果一个再增加一个新的控件,需要添加逻辑,我们只需要修改仲裁者的方法,就可以做到全局的掌控,达到了修改最少的代码来扩展程序的行为,因此仲裁者模式非常的重要和实用。



**三、总结**



对我们的程序而言,仲裁者模式适合于某一个部分发生改变就会导致其他部分作出相应的改变的情况,我们将这种变换的规律抽象出来,编程仲裁者,从而很好地协商各个部分,当组员有问题的时候,直接告诉仲裁者,不与其它成员打交道,让仲裁者赋值这些繁琐的事务,这样条理就很清晰了,因此仲裁者也成为中介者,可以想象很多人要去租房,很多人要把房子出租,如果私下里面去商量,既浪费时间,又很难找到对方,通过中介这个对象,它收集了很多的租房和出租房的信息,这样就能很快的找到最适合的房子。由此可见生活就是最好的设计模式。仲裁者模式对于代码的修改(很容易定位错误)、新的成员的加入、代码的复用(组员部分可以复用,仲裁者部分不易复用)都有着一定的简化,将该集中处理的集中起来,将该分散的分散出去,无疑是一种好的设计模式。对比于外观模式Facade,仲裁者需要和组员沟通,是双向的,而外观模式facade角色只是对其他角色进行整合,是单向的。设计模式至今我们已经研究了16种了,这其中很多设计模式都是有着关联的,同样也有着不同之处,但是都和实际问题是分不开的,设计模式是实际问题的抽象和解决方法,为了提高可扩展性和组件化,实际问题是设计模式的来源和最终归宿。





## 总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外想要面试题及答案的小伙伴请[点击这里自行领取](https://gitee.com/vip204888/java-p7),本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

**下面有部分截图希望能对大家有所帮助。**

的来源和最终归宿。





## 总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外想要面试题及答案的小伙伴请[点击这里自行领取](https://gitee.com/vip204888/java-p7),本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

**下面有部分截图希望能对大家有所帮助。**

![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/451fd1ea535f1b398a7576c1fe63a6be.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值