代理模式(Proxy Pattern)是一个使用率非常高的模式,定义:为其他对象提供一种代理以控制对这个对象的访问
优点:职责清晰、高扩展性、智能化
缺点:
由于在客户端和真实主体之间增加了代理对象,所以有些类型的代理模式可能会造成请求的处理速度变慢。
实现代理模式需要额外的工作(如果这个算缺点的话)
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
因为这个公众号申请的时间晚,所以没有留言功能。所以重新搞了个号