衡水网站网站建设,义乌市建设局官方网站,惠普网站建设的目标,南通网站建设服务Go和Java实现中介者模式
下面通过一个同事之间相互通信的例子来说明中介者模式的使用。
1、中介者模式
中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类#xff0c;该类通常处理不同类之间的
通信#xff0c;并支持松耦合#xff0c;使代码…Go和Java实现中介者模式
下面通过一个同事之间相互通信的例子来说明中介者模式的使用。
1、中介者模式
中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类该类通常处理不同类之间的
通信并支持松耦合使代码易于维护。中介者模式属于行为型模式。 意图用一个中介对象来封装一系列的对象交互中介者使各对象不需要显式地相互引用从而使其耦合松 散而且可以独立地改变它们之间的交互。 主要解决对象与对象之间存在大量的关联关系这样势必会导致系统的结构变得很复杂同时若一个对象发 生改变我们也需要跟踪与之相关联的对象同时做出相应的处理。 何时使用多个类相互耦合形成了网状结构。 如何解决将上述网状结构分离为星型结构。 关键代码对象 Colleague 之间的通信封装到一个类中单独处理。 应用实例1、中国加入 WTO 之前是各个国家相互贸易结构复杂现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架其中C控制器就是 M模型和 V视图的中介者。 优点1、降低了类的复杂度将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。 缺点中介者会庞大变得复杂难以维护。 使用场景1、系统中对象之间存在比较复杂的引用关系导致它们之间的依赖关系结构混乱而且难以复用该 对象。 2、想通过一个中间类来封装多个类中的行为而又不想生成太多的子类。 注意事项不应当在职责混乱的时候使用。 适用性 一组对象以定义良好但是复杂的方式进行通信产生的相互依赖关系结构混乱且难以理解。 一个对象引用其他很多对象并且直接与这些对象通信导致难以复现该对象。 想定制一个分布在多个类中的行为而又不想生成太多的子类。
2、Go实现中介者模式
package mediator// Colleague同事类
type Colleague interface {Send(string)Notify(string)
}package mediatorimport fmt// ColleagueA同事类A
type ColleagueA struct {Mediator
}func (colleagueA *ColleagueA) Send(message string) {colleagueA.Mediator.Send(message, colleagueA)
}func (colleagueA *ColleagueA) Notify(message string) {fmt.Println(同事A得到信息: message)
}package mediatorimport fmt// ColleagueB同事类B
type ColleagueB struct {Mediator
}func (colleagueB *ColleagueB) Send(message string) {colleagueB.Mediator.Send(message, colleagueB)}func (colleagueB *ColleagueB) Notify(message string) {fmt.Println(同事B得到信息: message)}package mediator// Mediator中介者类
type Mediator interface {Send(string, Colleague)
}package com.mediator;// ConcreteMediator
public class ConcreteMediator extends Mediator{private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB colleagueB;}Overridepublic void send(String message, Colleague colleague) {if (colleague colleagueA){colleagueB.notify(message);}else{colleagueA.notify(message);}}
}package mainimport . proj/mediatorfunc main() {concreteMediator : ConcreteMediator{}colleagueA : ColleagueA{Mediator: concreteMediator}colleagueB : ColleagueB{Mediator: concreteMediator}concreteMediator.SetColleagueA(colleagueA)concreteMediator.SetColleagueB(colleagueB)colleagueA.Send(吃过饭了没?)colleagueB.Send(没有呢,你打算请客吗?)
}# 程序输出
同事A得到信息:吃过饭了没?
同事A得到信息:没有呢,你打算请客吗?3、Java实现中介者模式
package com.mediator;// Colleague同事类
public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator){this.mediator mediator;}public void send(String message){this.mediator.send(message,this);}public abstract void notify(String message);
}package com.mediator;// ColleagueA同事类A
public class ColleagueA extends Colleague{public ColleagueA(Mediator mediator) {super(mediator);}Overridepublic void notify(String message){System.out.println(同事A得到信息:message);}
}package com.mediator;// ColleagueB同事类B
public class ColleagueB extends Colleague{public ColleagueB(Mediator mediator) {super(mediator);}Overridepublic void notify(String message){System.out.println(同事B得到信息:message);}
}package com.mediator;// Mediator中介者类
public abstract class Mediator {public abstract void send(String message,Colleague colleague);
}package com.mediator;// ConcreteMediator
public class ConcreteMediator extends Mediator{private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB colleagueB;}Overridepublic void send(String message, Colleague colleague) {if (colleague colleagueA){colleagueB.notify(message);}else{colleagueA.notify(message);}}
}package com.mediator;public class Test {public static void main(String[] args) {ConcreteMediator concreteMediator new ConcreteMediator();ColleagueA colleagueA new ColleagueA(concreteMediator);ColleagueB colleagueB new ColleagueB(concreteMediator);concreteMediator.setColleagueA(colleagueA);concreteMediator.setColleagueB(colleagueB);colleagueA.send(吃过饭了没?);colleagueB.send(没有呢,你打算请客吗?);}
}# 程序输出
同事B得到信息:吃过饭了没?
同事A得到信息:没有呢,你打算请客吗?