老套路还是推一下新号
定义:为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
门面模式有时也称为外观模式
优点
简化了调用过程,不用深入了解子系统,以防给子系统带来风险。
减少系统依赖,松散耦合。
更好的划分访问层次,提高安全性。
缺点
当增加子系统和扩展子系统时,可能容易带来未知风险。
某些情况下违背单一职责原则。
这个模式里面涉及的角色较少
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.
运行结果
门面模式、代理模式、适配器模式这三种模式特别接近,但还是有区别的,如果有所遗忘或者混淆的话建议阅读一下之前的文章