写作网站投稿平台,163企业邮箱登录入口官网,广州网站备案要审核多久,上海设计公司官网目录
定义
结构
案例
优点
缺点
使用场景 定义
又叫调停模式#xff0c;定义一个中介角色来封装一系列对象之间的交互#xff0c;使原有对象之间的耦合松散#xff0c;且可以独立地改变它们之间的交互。
结构
中介者模式包含以下主要角色#xff1a;
抽象中介者角…目录
定义
结构
案例
优点
缺点
使用场景 定义
又叫调停模式定义一个中介角色来封装一系列对象之间的交互使原有对象之间的耦合松散且可以独立地改变它们之间的交互。
结构
中介者模式包含以下主要角色
抽象中介者角色它是中介者的接口提供了同事对象注册与转发同事对象信息的抽象方法。具体中介者角色实现中介者接口定义一个 List 来管理同事对象协调各个同事角色之间的交互关系因此它依赖于同事角色。抽象同事类角色定义同事类的接口保存中介者对象提供同事对象交互的抽象方法实现所有相互影响的同事类的公共功能。具体同事类角色是抽象同事类的实现者当需要与其他同事对象交互时由中介者对象负责后续的交互。
案例
//抽象中介类
public abstract class Mediator {public abstract void contact(String message,Person person);public abstract void getMessage(Person person);
} 具体中介类 public class MediatorStructure extends Mediator {private ListHouseOwner houseOwners new ArrayList();private ListTenant tenants new ArrayList();//购房者的要求private MapTenant, ListString tenantRequest new HashMap();//房主的服务private MapHouseOwner, ListString houseOwnerResponse new HashMap();public ListHouseOwner getHouseOwners() {return houseOwners;}public void setHouseOwners(HouseOwner houseOwner) {houseOwners.add(houseOwner);}public ListTenant getTenants() {return tenants;}public void setTenants(Tenant tenant) {tenants.add(tenant);}Overridepublic void contact(String message, Person person) {ListString list null;if (person instanceof HouseOwner) {//说明是房主联系中介中介需要把消息给对应的购房者//首先判断信息map中有没有这个房主信息HouseOwner houseOwner (HouseOwner) person;list houseOwnerResponse.get(person);if (list null || list.size() 0) {//说明没有这个房主的信息list new ArrayList();list.add(message);houseOwnerResponse.put(houseOwner, list);} else {if (list.contains(message)) {//说明已经存在这个消息了return;}list.add(message);houseOwnerResponse.put(houseOwner, list);}} else {//说明购房者发起了消息Tenant tenant (Tenant) person;list tenantRequest.get(tenant);if (list null || list.size() 0) {list new ArrayList();//说明没有这个购房者的信息list.add(message);tenantRequest.put(tenant, list);} else {if (list.contains(message)) {//说明已经存在这个消息了return;}list.add(message);tenantRequest.put(tenant, list);}}}public void getMessage(Person person) {SetString set new HashSet();if (person instanceof HouseOwner) {//房主主动获取购房者的需求for (Tenant tenant : tenantRequest.keySet()) {ListString list tenantRequest.get(tenant);set.addAll(list);}((HouseOwner) person).getMessage(set);} else {//购房者只需要知道符合自己的就可以ListString list tenantRequest.get(person);for (String s : list) {for (HouseOwner houseOwner : houseOwnerResponse.keySet()) {ListString response houseOwnerResponse.get(houseOwner);if (response.contains(s)) {set.add(houseOwner.name);}}}((Tenant) person).getMessage(set);}}
} 抽象同事类 public abstract class Person {protected String name;protected Mediator mediator;public String getName() {return name;}public void setName(String name) {this.name name;}public Mediator getMediator() {return mediator;}public void setMediator(Mediator mediator) {this.mediator mediator;}public Person(String name, Mediator mediator) {this.name name;this.mediator mediator;}abstract void contact(String message);
} 房主 public class HouseOwner extends Person {public HouseOwner(String name, Mediator mediator) {super(name, mediator);}Overridevoid contact(String message) {System.out.println(name房主发布了一条消息message);mediator.contact(message,this);}public void getMessage(Set message){System.out.println(name房主获得了消息message);}
}public class Tenant extends Person{public Tenant(String name, Mediator mediator) {super(name, mediator);}Overridevoid contact(String message) {System.out.println(name购房者发布了一条消息:message);mediator.contact(message,this);}void getMessage(Set message){System.out.println(name购房者获得了消息message);}
} 测试 public class Client {public static void main(String[] args) {MediatorStructure mediatorStructure new MediatorStructure();HouseOwner houseOwnerOne new HouseOwner(房主一号, mediatorStructure);HouseOwner houseOwnerTwo new HouseOwner(房主二号, mediatorStructure);Tenant tenantOne new Tenant(买房一号,mediatorStructure);Tenant tenantTwo new Tenant(买房一号,mediatorStructure);mediatorStructure.setHouseOwners(houseOwnerOne);mediatorStructure.setHouseOwners(houseOwnerTwo);mediatorStructure.setTenants(tenantOne);mediatorStructure.setTenants(tenantTwo);tenantOne.contact(汤臣一品);tenantOne.contact(汤臣二品);tenantTwo.contact(汤臣三品);tenantTwo.contact(汤臣四品);houseOwnerOne.contact(汤臣一品);houseOwnerTwo.contact(汤臣六品);mediatorStructure.getMessage(houseOwnerOne);mediatorStructure.getMessage(tenantOne);}
} 买房一号购房者发布了一条消息:汤臣一品 买房一号购房者发布了一条消息:汤臣二品 买房一号购房者发布了一条消息:汤臣三品 买房一号购房者发布了一条消息:汤臣四品 房主一号房主发布了一条消息汤臣一品 房主二号房主发布了一条消息汤臣六品 房主一号房主获得了消息[汤臣三品, 汤臣四品, 汤臣二品, 汤臣一品] 买房一号购房者获得了消息[房主一号] 案例中存在两种同事角色购房者以及房主中介类保存不同同事类对象然后根据不同同事类给出不同返回结果。
优点
松散耦合中介者模式通过把多个同事对象之间的交互封装到中介者对象里面从而使得同事对象之间松散耦合基本上可以做到互补依赖。这样一来同事对象就可以独立地变化和复用而不再像以前那样“牵一处而动全身”了。集中控制交互多个同事对象的交互被封装在中介者对象里面集中管理使得这些交互行为发生变化的时候只需要修改中介者对象就可以了当然如果是已经做好的系统那么就扩展中介者对象而各个同事类不需要做修改。一对多关联转变为一对一的关联没有使用中介者模式的时候同事对象之间的关系通常是一对多的引入中介者对象以后中介者对象和同事对象的关系通常变成双向的一对一这会让对象的关系更容易理解和实现。
缺点
当同事类太多时中介者的职责将很大它会变得复杂而庞大以至于系统难以维护。
使用场景
系统中对象之间存在复杂的引用关系系统结构混乱且难以理解。当想创建一个运行于多个类之间的对象又不想生成新的子类时。