怎么把自己做的网站发布,批量 网站标题,二手房网站开发,iis10 wordpress中介者模式
中介者模式主要是将关联关系由一个中介者类统一管理维护#xff0c;一般来说#xff0c;同事类之间的关系是比较复杂的#xff0c;多个同事类之间互相关联时#xff0c;他们之间的关系会呈现为复杂的网状结构#xff0c;这是一种过度耦合的架构#xff0c;即…中介者模式
中介者模式主要是将关联关系由一个中介者类统一管理维护一般来说同事类之间的关系是比较复杂的多个同事类之间互相关联时他们之间的关系会呈现为复杂的网状结构这是一种过度耦合的架构即不利于类的复用也不稳定。例如在下左图中有六个同事类对象假如对象1发生变化那么将会有4个对象受到影响。如果对象2发生变化那么将会有5个对象受到影响。也就是说同事类之间直接关联的设计是不好的。如果引入中介者模式那么同事类之间的关系将变为星型结构从下右图中可以看到任何一个类的变动只会影响的类本身以及中介者这样就减小了系统的耦合。一个好的设计必定不会把所有的对象关系处理逻辑封装在本类中而是使用一个专门的类来管理那些不属于自己的行为。 定义 又叫调停模式定义一个中介角色来封装一系列对象之间的交互使原有对象之间的耦合松散且可以独立地改变它们之间的交互。中介者模式包含以下主要角色 抽象中介者Mediator角色它是中介者的接口提供了同事对象注册与转发同事对象信息的抽象方法。 具体中介者ConcreteMediator角色实现中介者接口定义一个 List 来管理同事对象协调各个同事角色之间的交互关系因此它依赖于同事角色。 抽象同事类Colleague角色定义同事类的接口保存中介者对象提供同事对象交互的抽象方法实现所有相互影响的同事类的公共功能。 具体同事类Concrete Colleague角色是抽象同事类的实现者当需要与其他同事对象交互时由中介者对象负责后续的交互。
案例实现
【例】租房
现在租房基本都是通过房屋中介房主将房屋托管给房屋中介而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。
类图如下 代码如下
首先租客和房东都是人我们先定义Person抽象类然后具体实现租客Tenant和房东HouseOwner类代码如下
// 抽象类
public abstract class Person {protected String name;protected Mediator mediator; // 持有一个中介者对象public Person(String name,Mediator mediator){this.name name;this.mediator mediator;}public abstract String getMessage(String msg);
}// 租客具体实现
public class Tenant extends Person{private String lease; // 租客租期public Tenant(String name,String lease, Mediator mediator) {super(name, mediator);this.lease lease;}public String getMessage(String msg){System.out.println(我是租客收到了中介发来的信息为msg);return 我叫 name 我的想租lease;}
}// 房东具体实现
public class HouseOwner extends Person{private String address; // 房东房子地址public HouseOwner(String name,String address, Mediator mediator) {super(name, mediator);this.address address;}//获取信息public String getMessage(String msg){System.out.println(我是房东收到中介发来的信息msg);return 我叫 name 房子的位置是address;}
}注意上面的HouseOwner和Tenant都是同事类都持有中介者对象目的是让乱七八糟的同事类都和中介者类进行关联而不是让同事类相互关联后面进行调用只需要通过中介者类即可下面定义中介者类
// 抽象中介类
public abstract class Mediator {private String name;public Mediator(String name){this.name name;}public abstract String constact(String msg,Person person);
}// 中介类具体实现
public class MediatorCompany extends Mediator{private HouseOwner houseOwner;private Tenant tenant;public MediatorCompany(String name) {super(name);}Overridepublic String constact(String msg,Person person) {if(person instanceof HouseOwner){// 如果是房东return houseOwner.getMessage(msg);}if(person instanceof Tenant){// 如果是租客return tenant.getMessage(msg);}return null;}public HouseOwner getHouseOwner() {return houseOwner;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner houseOwner;}public Tenant getTenant() {return tenant;}public void setTenant(Tenant tenant) {this.tenant tenant;}
}
上面的代码只是维护了租客和房东两个同事类如果还有其他的同事类例如开发商、政府、A公司、B公司等那么constact的逻辑就比较复杂了。但是优点是将所有同事类都关联到一个中介者类中减少了同事类之间的复杂关联关系。下面要实现房东和组合的通信或者调用只需要通过中介者实现类即可测试代码如下
public class Main {public static void main(String[] args) {// 中介公司MediatorCompany mediatorCompany new MediatorCompany(王牌中介公司);// 实例化同事类HouseOwner houseOwner new HouseOwner(马云, 杭州西溪阿里园区,mediatorCompany);Tenant tenant new Tenant(马化腾, 99年, mediatorCompany);mediatorCompany.setTenant(tenant);mediatorCompany.setHouseOwner(houseOwner);String msg1 mediatorCompany.constact(你的房子什么情况呀,houseOwner);System.out.println(房东回复msg1);String msg2 mediatorCompany.constact(你想租多久呀,tenant);System.out.println(租客回复msg2);}
}结果输出 我是房东收到中介发来的信息你的房子什么情况呀 房东回复我叫马云房子的位置是杭州西溪阿里园区 我是租客收到了中介发来的信息为你想租多久呀 租客回复我叫马化腾我的想租99年 优点 松散耦合 中介者模式通过把多个同事对象之间的交互封装到中介者对象里面从而使得同事对象之间松散耦合基本上可以做到互补依赖。这样一来同事对象就可以独立地变化和复用而不再像以前那样“牵一处而动全身”了。 集中控制交互 多个同事对象的交互被封装在中介者对象里面集中管理使得这些交互行为发生变化的时候只需要修改中介者对象就可以了当然如果是已经做好的系统那么就扩展中介者对象而各个同事类不需要做修改。 一对多关联转变为一对一的关联 没有使用中介者模式的时候同事对象之间的关系通常是一对多的引入中介者对象以后中介者对象和同事对象的关系通常变成双向的一对一这会让对象的关系更容易理解和实现。
缺点
当同事类太多时中介者的职责将很大它会变得复杂而庞大以至于系统难以维护。
使用场景
系统中对象之间存在复杂的引用关系系统结构混乱且难以理解。当想创建一个运行于多个类之间的对象又不想生成新的子类时。
参考内容 传智播客设计模式相关笔记主要