JAVA中介者模式
JAVA中介者模式
1、前言
中秋快乐,哈哈晚了一天说这句话!本来按道理我22号就应该把关于设计模式的博客写完。但是你知道的,我老是给自己放假。于是,中秋佳节,我就和我的小伙伴们打了三天撸。非常开心,感觉自己都活过来了!不过这个月还是要把设计模式的搞完嘞。
SO,今天我们继续聊行为型结构模式中的中介者模式!
2、中介者模式的概念
中介者模式:定义一个对象来封装一系列对象的交互,中介者模式使各个对象之间不需要相互引用,从而使得其松耦合,而且用户可以独立地改变他们之间的交互。
中介者模式在我们平时软件中的例子,就是邮件中的群发功能。列如,公司有一个房价通知如果它自己一个个进行发送给每个用户那么就有多少个用户我们就发多少份邮件。但是如果创建一个中介者对象帮我们将所有的用户都发在同一个对象集合中,那我们就只需要发送一份。这种感觉就是中介者模式。实现了,不同用户之间的松耦合的作用。
另外一个例子就是关于QQ群,如果要发一个通知按每个人来发送。那势必要重复很多遍相同工作。如果创建一个QQ群,在群里发布,那么所有的用户只需要发送一遍,其他在群中的用户就都能够接收到。
一个多对多的关系。
通过中介者进行简化相互耦合的联系。通过一个一对多的关系。
3、中介模式的UML图
1、Mediator(抽象中介者):它定义一个接口用于与各同事对象之间进行通信。
2、ConcreteMediator(具体中介者):它继承了抽象中介者,通过协调各个同时队象来实现协作行为,它维持了对各个同时对象的引用。
3、Colleague(抽象同事类) :它定义各个同时类共有的方法,并声明了一些抽象方法供子类实现,同时他维持了一个对抽象中介者类的引用,其子类可以通过该引用进行通讯。
4、ConcreteColleague(具体同事类):它是抽象同事类的子类,每一个同事对象在需要和其他同事对象通信时先与中介者通信。
4、中介模式的实现
1、抽象中介者类:Mediator
package mediatorPattern;
public abstract class Mediator {
public abstract void componentChanged(Component c);
}
2、具体中介者类:concreteMediator
package mediatorPattern;
public class ConcreteMediator extends Mediator{
//维持对各个同事类的引用
public Button addButton;
public List list;
public TextBox userNameTextBox;
public Combox cb;
@Override
public void componentChanged(Component c) {
// TODO Auto-generated method stub
//单击按钮
if(c==addButton) {
System.out.println("---单击增加按钮");
list.update();
cb.update();
userNameTextBox.update();
}
//从列表框选择客户
else if(c==list) {
System.out.println("--从列表中选择客户");
cb.selected();
userNameTextBox.setText();
}
else if(c==cb) {
System.out.println("--从组合框中选择用户");
cb.selected();
userNameTextBox.setText();
}
}
}
3、抽象组件类:Component
package mediatorPattern;
public abstract class Component {
//抽象组件类,相当于同事类。
protected Mediator mediator;
public void setMediator(Mediator m) {
mediator=m;
}
//转发调用
public void changed() {
mediator.componentChanged(this);
}
public abstract void update();
}
4、按钮类,充当具体同事类:Button.
package mediatorPattern;
public class Button extends Component{
@Override
public void update() {
// TODO Auto-generated method stub
}
}
5、列表类,充当具体同事类:List
package mediatorPattern;
public class List extends Component {
@Override
public void update() {
System.out.println("列表框增加一项:杨过");
}
public void selected() {
System.out.println("列表框选中项:小龙女");
}
}
6、组合框类,充当具体同事类:ComboBox
package mediatorPattern;
public class Combox extends Component{
@Override
public void update() {
System.out.println("组合框增加一项:杨过");
}
public void selected() {
System.out.println("组合框选中项:小龙女");
}
}
7、文本框类,充当具体同事类:TextBox
package mediatorPattern;
public class TextBox extends Component{
@Override
public void update() {
System.out.println("客户信息增加成功后文本框清空");
}
public void setText() {
System.out.println("文本框显示:小龙女");
}
}
8、测试类:Client
package mediatorPattern;
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator;
mediator = new ConcreteMediator();
//定义同事类》
Button addBT = new Button();
List list = new List();
Combox cb = new Combox();
TextBox userNameTB = new TextBox();
addBT.setMediator(mediator);
list.setMediator(mediator);
cb.setMediator(mediator);
userNameTB.setMediator(mediator);
mediator.addButton = addBT;
mediator.list = list;
mediator.cb = cb;
mediator.userNameTextBox = userNameTB;
addBT.changed();
System.out.println("-------------------------");
list.changed();
}
}
5、中介模式的优缺点以及使用的场景
优点
- 中介中模式简化了对象之间的相互交互,它用中介者和同事的一对多交互替代了原来同事类之间的多对多的交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构换成相对接单的星状结构。
- 可将各个同事类对象进行解耦。中介者有利于各同事之间的耦合,可以独立地改变和复用各个同事类和中介者。
- 可以减少子类的生成。
缺点
在具体中介中包含了大量的同事类之间的交互细节,可能会使具体中介者非常复杂,使得系统难以维护。
使用的场景
- 系统中对象之间存在复杂的引用关系,系统结构混乱难以理解。
- 一个对象由于引用了其他很多对象并且直接和这戏对象进行通信,导致难以复用该对象。
6、总结
可能不信,偷懒了大半个月。哈哈,但是,技术还是得坚持的。我是一个靠才华吃饭的人。其次,我最近了解了一些SRM系统得业务,发现,业务真的很重要,我所有的技术就是为了这些来服务的。因为我需要将自己的技术转化成产出,那么业务就是我需要通过技术来实现的东西。将复杂得事情进行抽象,简化,将线下得事改成线上来提高效率。这就是我得学计算机得作用,切不可以本末倒置!