我看到介体和前端控制器的意图相似。两者都基本上控制/调解以促进松耦合。
我知道调解员不是GOF模式。因此,从这个角度思考控制器/前端控制器可以称为中介模式的示例/子集。
如果没有,有人可以给我一个真实系统的具体例子,或者来自核心java或任何可以称为前端控制器而不是中介的框架,反之亦然?
答案 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();
}
}
Front Controller是一个位于业务模型之上并处理传入Web请求的对象。在ASP.NET中,一个例子是HTTPHandler(一个控制所有传入请求并调度它们的对象)。前端控制器将" Web服务器"来自"处理特定请求的逻辑"逻辑,因此它知道如何为它创建正确的对象。此外,它还用于在请求中执行AOP样式的行为注入。 source 1,source 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
}
}
正如您所看到的,它们是非常不同的野兽:中介者促进从类到类的通信,前端控制器集中来自第三方的通信并将其发送到单个适当的类。此外,中介必须与所创建的类无关 - 实际上,它只是为此目的而注入依赖 - 而前端控制器必须知道根据上下文创建哪个类 - 它可以使用工厂,但是它仍然负责调用"创建"方法