长亭百川云 - 文章详情

门面模式

Delphi研习社

43

2024-07-13

老套路还是推一下新号

定义:为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

门面模式有时也称为外观模式

优点

  • 简化了调用过程,不用深入了解子系统,以防给子系统带来风险。

  • 减少系统依赖,松散耦合。

  • 更好的划分访问层次,提高安全性。

缺点

  • 当增加子系统和扩展子系统时,可能容易带来未知风险。

  • 某些情况下违背单一职责原则。

UML 解析

这个模式里面涉及的角色较少

  • Facade:知道哪些子系统类负责处理请求。将客户的请求代理给适当的子系统对象。

  • Subsystemclasses:实现子系统的功能。处理由 Facade 对象指派的任务。没有 facade 的任何相关信息;即没有指向 facade 的指针。

案例

案例 1:去银行办理业务,有个前台接待你,然后,这个前台会问你需要办什么业务,他会一个一个带你办理,这样我们就不需要到处乱串、到处找对应业务窗口了。这个前台人员就相当于门面模式。

案例 2:我们建房子,如果没有包工头的话,那就是你自己要去找水泥工,电工、装修工等。但如果有了包工头,这些活你都不用干了,直接跟包工头说,需要电工来把线路搞好。这个包工头就可以理解为门面模式

案例 3:我们后端开发的 controller,也可以理解为门面模式,比如说获取用户账户信息,先查 UserService 获取用户信息,然后查 UserAccountService 用户账户信息。

翻了很长时间百度,想找个比较满意的案例(最好是英雄联盟相关的)做代码,可惜并没有。看到一个和游戏相关的案例,我将代码整理翻译

需求:两个人要结婚,结婚的要求是两个人必须是好友,但是两个人不能有结拜关系。

参考文章地址:https://www.programminghunter.com/article/4946659616/

UnitFacade.pas

unit UnitFacade;  
  
interface  
  
type  
  // 好友  
  TFriend = class  
  public  
    function IsFriend(a: string; b: string): Boolean;  
  end;  
  
  // 结婚  
  TMarry = class  
  public  
    procedure MarrySomeBody(a: string; b: string);  
  end;  
  
  // 结拜  
  TSworn = class  
  public  
    function IsSworn(a: string; b: string): Boolean;  
  end;  
  
  TSociety = class  
  private  
    FFriend: TFriend;  
    FSworn: TSworn;  
    FMarry: TMarry;  
  public  
    procedure Marry(a, b: string);  
  
    constructor Create(); overload;  
  end;  
  
implementation  
  
{ TFriend }  
  
function TFriend.IsFriend(a, b: string): Boolean;  
begin  
  
  Result := True;  
end;  
  
{ TSworn }  
  
function TSworn.IsSworn(a, b: string): Boolean;  
begin  
  
  Result := False;  
end;  
  
{ TMarry }  
  
procedure TMarry.MarrySomeBody(a, b: string);  
begin  
  Writeln(a + '和' + b + ' 结婚了')  
end;  
  
{ TSociety }  
  
constructor TSociety.Create;  
begin  
  // 原文中还使用了单例模式,这里我直接创建对象了  
  Self.FFriend := TFriend.Create;  
  
  Self.FSworn := TSworn.Create;  
  Self.FMarry := TMarry.Create;  
end;  
  
procedure TSociety.Marry(a, b: string);  
begin  
  if not Self.FFriend.IsFriend(a, b) then begin  
    Writeln(a + '和' + b + ' 不是好友关系');  
    Exit;  
  end;  
  
  if Self.FSworn.IsSworn(a, b) then begin  
    Writeln(a + '和' + b + ' 是结拜关系');  
    Exit;  
  end;  
  Writeln(a + ' 和 ' + b + '  是好友关系,不是结拜关系');  
  FMarry.MarrySomeBody(a, b);  
end;  
  
end.  

Facade

program Facade;  
  
{$APPTYPE CONSOLE}  
  
{$R *.res}  
  
uses  
  System.SysUtils,  
  UnitFacade in 'UnitFacade.pas';  
  
begin  
  try  
    TSociety.Create.Marry('小强', '小白');  
    readln;  
  except  
    on E: Exception do  
      Writeln(E.ClassName, ': ', E.Message);  
  end;  
  
end.  

运行结果

结语

门面模式、代理模式、适配器模式这三种模式特别接近,但还是有区别的,如果有所遗忘或者混淆的话建议阅读一下之前的文章

代理模式

适配器模式之类适配

适配器模式-续

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2