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

时间:2014-06-21 05:22:54

标签: design-patterns

我看到介体和前端控制器的意图相似。两者都基本上控制/调解以促进松耦合。

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

如果没有,有人可以给我一个真实系统的具体例子,或者来自核心java或任何可以称为前端控制器而不是中介的框架,反之亦然?

1 个答案:

答案 0 :(得分:2)

Mediator是您在用于通信的类中注入的依赖项。不创建Mediator,也不创建它帮助的类。此外,调解员和具体课程都相互了解。 Mediator控制着多对多的通信网络。

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();
  }
}

source

Front Controller是一个位于业务模型之上并处理传入Web请求的对象。在ASP.NET中,一个例子是HTTPHandler(一个控制所有传入请求并调度它们的对象)。前端控制器将" Web服务器"来自"处理特定请求的逻辑"逻辑,因此它知道如何为它创建正确的对象。此外,它还用于在请求中执行AOP样式的行为注入。 source 1source 2

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
   }
}

正如您所看到的,它们是非常不同的野兽:中介者促进从类到类的通信,前端控制器集中来自第三方的通信并将其发送到单个适当的类。此外,中介必须与所创建的类无关 - 实际上,它只是为此目的而注入依赖 - 而前端控制器必须知道根据上下文创建哪个类 - 它可以使用工厂,但是它仍然负责调用"创建"方法