厦门建站程序,wordpress博客网站多少钱,成都装修公司哪家口碑最好,什么是网页站点#x1f680;简介 又叫调停模式#xff0c;定义一个中介角色来封装一系列对象之间的交互#xff0c;使原有对象之间的耦合松散#xff0c;且可以独立地改变它们之间的交互。 从下右图中可以看到#xff0c;任何一个类的变 动#xff0c;只会影响的类本身#xff0c;以及…简介 又叫调停模式定义一个中介角色来封装一系列对象之间的交互使原有对象之间的耦合松散且可以独立地改变它们之间的交互。 从下右图中可以看到任何一个类的变 动只会影响的类本身以及中介者这样就减小了系统的耦合。一个好的设计必定不会把所有的对象关系处理逻辑封装在本类中而是使用一个专门的类来管理那些不属于自己的行为。 中介者模式包含以下主要角色 抽象中介者Mediator角色它是中介者的接口提供了同事对象注册与转发同事对象信息的抽象方法。 具体中介者ConcreteMediator角色实现中介者接口定义一个 List 来管理同事对象协调各个同事角色之间的交互关系因此它依赖于同事角色。 抽象同事类Colleague角色定义同事类的接口保存中介者对象提供同事对象交互的抽象方法实现所有相互影响的同事类的公共功能。 具体同事类Concrete Colleague角色是抽象同事类的实现者当需要与其他同事对象交互时由中介者对象负责后续的交互。
案例 现在租房基本都是通过房屋中介房主将房屋托管给房屋中介而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。下面我们用代码来举例一下 抽象中介者 Mediator 角色 public abstract class Mediator
{//声明一个联络方法public abstract void Contact(string message, Person person);
} 具体中介者ConcreteMediator角色 MediatorStructure类是一个中介者它有两个属性一个是房主(HouseOwner)一个是租客(Tenant)。当房主和租客需要通信时他们不直接通信而是通过MediatorStructure这个中介者来传递信息。 Contact方法是中介者的核心方法它接收两个参数一个是消息内容一个是发送消息的人。如果发送消息的人是房主那么这个消息就会被传递给租客如果发送消息的人是租客那么这个消息就会被传递给房主。这样就实现了房主和租客之间的间接通信。 public class MediatorStructure : Mediator
{public HouseOwner houseOwner { get; set; }public Tenant tenant { get; set; }public override void Contact(string message, Person person){if (person houseOwner){tenant.GetMessage(message);}else{houseOwner.GetMessage(message);}}
} 抽象同事类Colleague角色 public abstract class Person
{protected string name;protected Mediator mediator;public Person(string name, Mediator mediator){this.name name;this.mediator mediator;}
} 具体同事类Concrete Colleague角色 HouseOwner房屋拥有者和Tenant承租人。这两个类都继承自Person类并且都有一个Mediator类型的成员变量用于与中介者进行通信。 HouseOwner类有两个方法一个是Contact用于与中介者联系另一个是GetMessage用于获取信息。在Contact方法中会调用mediator的Contact方法将自己和消息传递给中介者。在GetMessage方法中会打印出自己获取到的信息。 //具体同事类 房屋拥有者
public class HouseOwner : Person
{public HouseOwner(string name, Mediator mediator) : base(name, mediator) { }//与中介者联系public void Contact(string message){mediator.Contact(message, this);}//获取信息public void GetMessage(string message){Console.WriteLine(房主 name 获取到的信息 message);}
}//具体同事类 承租人
public class Tenant : Person
{public Tenant(string name, Mediator mediator) : base(name, mediator) { }//与中介者联系public void Contact(string message){mediator.Contact(message, this);}//获取信息public void GetMessage(string message){Console.WriteLine(租房者 name 获取到的信息 message);}
} 测试类 在测试类中有三个角色房主(HouseOwner)、租户(Tenant)和中介(Mediator)。房主和租户都只需要知道中介即可他们之间的所有交互都通过中介来进行。 在Main函数中首先创建了一个中介机构(mediator)然后创建了一个名为张三的房主(houseOwner)和一个名为李四的租户(tenant)他们都知道这个中介机构。 然后中介机构需要知道房主和租户所以设置了mediator的houseOwner和tenant属性。 class MyClass
{public static void Main(string[] args){//一个房主、一个租房者、//一个中介机构MediatorStructure mediator new MediatorStructure();//房主和租房者只需要知道中介机构即可HouseOwner houseOwner new HouseOwner(张三, mediator);Tenant tenant new Tenant(李四, mediator);//中介结构要知道房主和租房者mediator.houseOwner houseOwner;mediator.tenant tenant;tenant.Contact(需要租三室的房子);houseOwner.Contact(我这有三室的房子你需要租吗);}
} 运行结果 优缺点 优点 它支持以不同的方式遍历一个聚合对象在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个不同的迭代器来替换原有迭代器即可改变遍历算法我们也可以自己定义迭代器 的子类以支持新的遍历方式。 迭代器简化了聚合类。由于引入了迭代器在原有的聚合对象中不需要再自行提供数据遍历等方法这样可以简化聚合类的设计。 在迭代器模式中由于引入了抽象层增加新的聚合类和迭代器类都很方便无须修改原有代码满足 “开闭原则” 的要求。 缺点 增加了类的个数这在一定程度上增加了系统的复杂性。 使用场景 当需要为聚合对象提供多种遍历方式时。 当需要为遍历不同的聚合结构提供一个统一的接口时。 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。