Design patterns 前端控制器或任何其他控制器可以称为中介模式的示例吗?

Design patterns 前端控制器或任何其他控制器可以称为中介模式的示例吗?,design-patterns,Design Patterns,我认为调解人和前线控制员的意图是相似的。两者基本上都控制/调节以促进松耦合 我知道调解人不是GOF模式。因此,从这个角度考虑,控制器/前端控制器可以称为中介模式的示例/子集 如果没有,有人能给我一个来自真实系统、核心java或任何框架的具体例子吗?在这些框架中,它可以被称为前端控制器,但不能被称为中介,反之亦然。中介是您注入类中的依赖项,它们将使用这些类进行通信。不会创建中介,也不会创建它所帮助的类。此外,中介和具体类都相互了解。调解人控制多对多的通信网络 class MainApp { s

我认为调解人和前线控制员的意图是相似的。两者基本上都控制/调节以促进松耦合

我知道调解人不是GOF模式。因此,从这个角度考虑,控制器/前端控制器可以称为中介模式的示例/子集


如果没有,有人能给我一个来自真实系统、核心java或任何框架的具体例子吗?在这些框架中,它可以被称为前端控制器,但不能被称为中介,反之亦然。

中介是您注入类中的依赖项,它们将使用这些类进行通信。不会创建中介,也不会创建它所帮助的类。此外,中介和具体类都相互了解。调解人控制多对多的通信网络

class MainApp
{
  static void Main()
  {
    var m = new ConcreteMediator();

    var c1 = new ConcreteColleague1(m);
    var c2 = new ConcreteColleague2(m);

    m.Colleague1 = c1;
    m.Colleague2 = c2;

    c1.Send("How are you?");
    c2.Send("Fine, thanks");

    // Wait for user 
    Console.Read();
  }
}

前端控制器是位于业务模型之上的对象,用于处理传入的web请求。在ASP.NET中,一个例子是HTTPHandler(一个控制所有传入请求并分派它们的对象)。前端控制器将“web服务器”逻辑与“处理特定请求”逻辑分离,因此它知道如何为其创建正确的对象。此外,它还用于在请求中执行AOP风格的行为注入

正如您所看到的,它们是非常不同的野兽:中介促进类与类之间的通信,前端控制器集中来自第三方的通信,并将其发送到单个适当的类。此外,中介器必须对所创建的类不可知——事实上,它是为了这个目的而注入的依赖项——而前端控制器必须根据上下文知道要创建哪个类——它可以使用工厂来实现这一点,但它仍然负责调用“create”方法

public class FrontController
{
   public Response HandleRequest(Request request)
   {
       try
       {
         EnsureRequestIsValid(Request request);
         var controller = FindController(request);
         return controller.HandleRequest(request);
       }
       catch (Exception ex)
       {
         return new ErrorResponse(ex); // Exceptions become error pages!
       }
   }

   private MVCController FindController(Request request)
   {
      // some logic here to choose and create the right MVC controller...
      // in reality typically the current application introspects here to find
      // the right controller and method, but you get my point...

      if (Request.Path.StartsWith("/foo/"))
      {
         return new FooController();
      }
   }

   private void EnsureRequestIsValid(Request request)
   {
      // the logic here is always executed, it should throw on error
   }
}