一、前言设计模式
二、中介者模式的概念ide
四、中介模式的实现this
六、总结3d
中秋快乐,哈哈晚了一天说这句话!原本按道理我22号就应该把关于设计模式的博客写完。可是你知道的,我总是给本身放假。因而,中秋佳节,我就和个人小伙伴们打了三天撸。很是开心,感受本身都活过来了!不过这个月仍是要把设计模式的搞完嘞。code
SO,今天咱们继续聊行为型结构模式中的中介者模式!component
中介者模式:定义一个对象来封装一系列对象的交互,中介者模式使各个对象之间不须要相互引用,从而使得其松耦合,并且用户能够独立地改变他们之间的交互。对象
中介者模式在咱们平时软件中的例子,就是邮件中的群发功能。列如,公司有一个房价通知若是它本身一个个进行发送给每一个用户那么就有多少个用户咱们就发多少份邮件。可是若是建立一个中介者对象帮咱们将全部的用户都发在同一个对象集合中,那咱们就只须要发送一份。这种感受就是中介者模式。实现了,不一样用户之间的松耦合的做用。blog
另一个例子就是关于QQ群,若是要发一个通知按每一个人来发送。那势必要重复不少遍相同工做。若是建立一个QQ群,在群里发布,那么全部的用户只须要发送一遍,其余在群中的用户就都可以接收到。
一个多对多的关系。
经过中介者进行简化相互耦合的联系。经过一个一对多的关系。
一、Mediator(抽象中介者):它定义一个接口用于与各同事对象之间进行通讯。
二、ConcreteMediator(具体中介者):它继承了抽象中介者,经过协调各个同时队象来实现协做行为,它维持了对各个同时对象的引用。
三、Colleague(抽象同事类) :它定义各个同时类共有的方法,并声明了一些抽象方法供子类实现,同时他维持了一个对抽象中介者类的引用,其子类能够经过该引用进行通信。
四、ConcreteColleague(具体同事类):它是抽象同事类的子类,每个同事对象在须要和其余同事对象通讯时先与中介者通讯。
一、抽象中介者类:Mediator
package mediatorPattern; public abstract class Mediator { public abstract void componentChanged(Component c); }
二、具体中介者类: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(); } } }
三、抽象组件类: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(); }
四、按钮类,充当具体同事类:Button.
package mediatorPattern; public class Button extends Component{ @Override public void update() { // TODO Auto-generated method stub } }
五、列表类,充当具体同事类:List
package mediatorPattern; public class List extends Component { @Override public void update() { System.out.println("列表框增长一项:杨过"); } public void selected() { System.out.println("列表框选中项:小龙女"); } }
六、组合框类,充当具体同事类:ComboBox
package mediatorPattern; public class Combox extends Component{ @Override public void update() { System.out.println("组合框增长一项:杨过"); } public void selected() { System.out.println("组合框选中项:小龙女"); } }
七、文本框类,充当具体同事类:TextBox
package mediatorPattern; public class TextBox extends Component{ @Override public void update() { System.out.println("客户信息增长成功后文本框清空"); } public void setText() { System.out.println("文本框显示:小龙女"); } }
八、测试类: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(); } }
优势
缺点
在具体中介中包含了大量的同事类之间的交互细节,可能会使具体中介者很是复杂,使得系统难以维护。
使用的场景
可能不信,偷懒了大半个月。哈哈,可是,技术仍是得坚持的。我是一个靠才华吃饭的人。其次,我最近了解了一些SRM系统得业务,发现,业务真的很重要,我全部的技术就是为了这些来服务的。由于我须要将本身的技术转化成产出,那么业务就是我须要经过技术来实现的东西。将复杂得事情进行抽象,简化,将线下得事改为线上来提升效率。这就是我得学计算机得做用,切不能够本末倒置!