长亭百川云 - 文章详情

代理模式

Delphi研习社

39

2024-07-13

代理模式(Proxy Pattern)是一个使用率非常高的模式,定义:为其他对象提供一种代理以控制对这个对象的访问

优点:职责清晰、高扩展性、智能化

缺点:

  • 由于在客户端和真实主体之间增加了代理对象,所以有些类型的代理模式可能会造成请求的处理速度变慢。

  • 实现代理模式需要额外的工作(如果这个算缺点的话)

UML 图解析

ISubject:该接口在代理模式中并不是必须的,只是为了遵循代码规范,便于后期维护

RealSubject:该类就是被代理的类

Proxy:很明显这个就是代理 RealSubject 的代理类

其实可以简单的理解为我们在原有类(对象)的基础上对其功能进行再次改造,但是同时不改变原有类的代码

实战案例

在英雄联盟中存在提莫、安妮、乐芙兰、大发明家这样的英雄,他们都有一个共同的特点就是需要英雄控制对应的道具(实在不知道该怎么称呼)进行攻击,例如:提莫的蘑菇、安妮的熊、乐芙兰的分身以及大发明家的炮台

道具本身都具备攻击的属性,只是他们只会单纯地攻击。此时需要英雄加以控制才能击中对应的目标。

而这些道具我们可以看作被代理者,英雄可以看作是代理者

 参考链接:

https://blog.csdn.net/qq\_39830579/article/details/105184973

代码实现

当初玩英雄联盟的时候有句话叫 团战可以输提莫必须死 所以代码的案例用了提莫

ProxyUnit

 1unit ProxyUnit;  
 2  
 3interface  
 4  
 5type  
 6  INormalAttack = interface  
 7    ['{0D26D561-70A3-4D36-85D0-2E3FF6F1E8EB}']  
 8    // 制造攻击  
 9    procedure makeAttack();  
10  end;  
11  
12  // 道具(可以是宠物、分身、炮台等) , 当然可以再建该类的子类具体出攻击方式,为了避免代码复杂这里就不再扩展  
13  
14  TProp = class(TInterfacedObject, INormalAttack)  
15  private  
16    // 生命值  
17    FBlood: Integer;  
18    FName: string;  
19  public  
20    property Blood: Integer read FBlood write FBlood;  
21    property PropName: string read FName write FName;  
22  
23    // 攻击  
24    procedure makeAttack(); overload;  
25  end;  
26  
27  // 英雄(可以是安妮、提莫等等)  
28  THero = class(TInterfacedObject, INormalAttack)  
29  private  
30    FProp: TProp;  
31     // 定义个 name 否则没办法称呼  
32    FName: string;  
33  public  
34    property HeroName: string read FName write FName;  
35  
36    property Prop: TProp read FProp write FProp;  
37  
38    // 构造方法,参数为道具  
39    constructor Create(Prop: TProp); overload;  
40    // 提伯斯攻击  
41    procedure makeAttack(); overload;  
42  end;  
43  
44implementation  
45  
46{ TTibbers }  
47  
48procedure TProp.makeAttack;  
49begin  
50  
51  Writeln(Self.PropName + '对目标造成伤害');  
52end;  
53  
54{ Annie }  
55  
56constructor THero.Create(Prop: TProp);  
57begin  
58  
59  FProp := Prop;  
60end;  
61  
62procedure THero.makeAttack;  
63begin  
64  
65  if FProp.Blood > 50 then  
66  begin  
67    Writeln(self.HeroName + '的' + FProp.PropName + '在进行攻击');  
68    FProp.makeAttack();  
69  end  
70  else  
71  begin  
72    Writeln(FProp.PropName + '生命值太低,停止攻击');  
73  end;  
74  
75end;  
76  
77end.

测试类

 1uses  
 2  System.SysUtils,  
 3  ProxyUnit in 'ProxyUnit.pas';  
 4  
 5begin  
 6  try  
 7      // 创建道具即被代理对象  
 8    var Prop := TProp.Create;  
 9    Prop.Blood := 100;  
10    Prop.PropName := '蘑菇';  
11  
12    // 创建英雄类,即代理类对象  
13    var Hero := THero.Create(Prop);  
14    // 攻击应该是持续的,所以搞个循环  
15    Hero.HeroName := '提莫';  
16  
17    while true do  
18    begin  
19      Hero.makeAttack();  
20      // 每攻击一次道具的生命值降低一次  
21      Hero.Prop.Blood := Hero.Prop.Blood - 50;  
22  
23      if Hero.Prop.Blood < 50 then  
24        break;  
25    end;  
26  
27  except  
28    on E: Exception do  
29      Writeln(E.ClassName, ': ', E.Message);  
30  end;  
31  
32  readln;  
33  
34end.

小结

源码存放在 GitHub ,地址:https://github.com/coder163/DesignPatternForDelphi

因为这个公众号申请的时间晚,所以没有留言功能。所以重新搞了个号

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

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