今天说一下代理模式.
从名字看大家都知道了代理模式,就是一个让一个类来帮你干某些事.是吧?嘿嘿.当然开始之前我们还是惯例来看看这个设计模式的UML:
我看到了代理类请求其实调用的还是RealRequest类的请求,只是Proxy去调用
--------------------------------------------------------------------------------
我们现在来用代码说话了:
第一个还是PHP
1 abstract class CommRequest{
2 abstract public function Request();
3 }
4
5 abstract class CommRequest{
6 abstract public function Request();
7 }
8 class ActualRequest extends CommRequest{
9 public function Request() {
10 echo("Actual Request !\n");
11 }
12
13 class ActualRequest extends CommRequest{
14 public function Request() {
15 echo("Actual Request !\n");
16 }
17 class PHPProxy extends CommRequest {
18 private $realRequest;
19 public function Request() {
20 if(isset($this->realRequest)){
21 echo("Proxy Here!\n");
22 $this->realRequest->Request();
23 }
24 }
25 }
26
27 class PHPProxy extends CommRequest {
28 private $realRequest;
29 public function Request() {
30 if(isset($this->realRequest)){
31 echo("Proxy Here!\n");
32 $this->realRequest->Request();
33 }
34 }
35 }
36
37 $p = new PHPProxy();
38 $p->Request();
39
2 abstract public function Request();
3 }
4
5 abstract class CommRequest{
6 abstract public function Request();
7 }
8 class ActualRequest extends CommRequest{
9 public function Request() {
10 echo("Actual Request !\n");
11 }
12
13 class ActualRequest extends CommRequest{
14 public function Request() {
15 echo("Actual Request !\n");
16 }
17 class PHPProxy extends CommRequest {
18 private $realRequest;
19 public function Request() {
20 if(isset($this->realRequest)){
21 echo("Proxy Here!\n");
22 $this->realRequest->Request();
23 }
24 }
25 }
26
27 class PHPProxy extends CommRequest {
28 private $realRequest;
29 public function Request() {
30 if(isset($this->realRequest)){
31 echo("Proxy Here!\n");
32 $this->realRequest->Request();
33 }
34 }
35 }
36
37 $p = new PHPProxy();
38 $p->Request();
39
--------------------------------------------------------------------------------
接下来来看看C#的代码.
1 namespace Proxy_DesignPattern
2 {
3 using System;
4 using System.Threading;
5
6 /// <SUMMARY></SUMMARY>
7 /// Summary description for Client.
8 ///
9 abstract class CommonSubject
10 {
11 abstract public void Request();
12 }
13
14 class ActualSubject : CommonSubject
15 {
16 public ActualSubject()
17 {
18 // Assume constructor here does some operation that takes quite a
19 // while - hence the need for a proxy - to delay incurring this
20 // delay until (and if) the actual subject is needed
21 Console.WriteLine("Starting to construct ActualSubject");
22 Thread.Sleep(1000); // represents lots of processing!
23 Console.WriteLine("Finished constructing ActualSubject");
24 }
25
26 override public void Request()
27 {
28 Console.WriteLine("Executing request in ActualSubject");
29 }
30 }
31
32 class Proxy : CommonSubject
33 {
34 ActualSubject actualSubject;
35
36 override public void Request()
37 {
38 if (actualSubject == null)
39 actualSubject = new ActualSubject();
40 actualSubject.Request();
41 }
42
43 }
44
45 public class Client
46 {
47 public static int Main(string[] args)
48 {
49 Proxy p = new Proxy();
50
51 // Perform actions here
52 // . . .
53
54 if (1 == 1) // at some later point, based on a condition,
55 p.Request();// we determine if we need to use subject
56
57 return 0;
58 }
59 }
60 }
61
62 namespace Proxy_DesignPattern
63 {
64 using System;
65 using System.Threading;
66
67 ///
68 /// Summary description for Client.
69 ///
70 abstract class CommonSubject
71 {
72 abstract public void Request();
73 }
74
75 class ActualSubject : CommonSubject
76 {
77 public ActualSubject()
78 {
79 // Assume constructor here does some operation that takes quite a
80 // while - hence the need for a proxy - to delay incurring this
81 // delay until (and if) the actual subject is needed
82 Console.WriteLine("Starting to construct ActualSubject");
83 Thread.Sleep(1000); // represents lots of processing!
84 Console.WriteLine("Finished constructing ActualSubject");
85 }
86
87 override public void Request()
88 {
89 Console.WriteLine("Executing request in ActualSubject");
90 }
91 }
92
93 class Proxy : CommonSubject
94 {
95 ActualSubject actualSubject;
96
97 override public void Request()
98 {
99 if (actualSubject == null)
100 actualSubject = new ActualSubject();
101 actualSubject.Request();
102 }
103
104 }
105
106 public class Client
107 {
108 public static int Main(string[] args)
109 {
110 Proxy p = new Proxy();
111
112 // Perform actions here
113 // . . .
114
115 if (1 == 1) // at some later point, based on a condition,
116 p.Request();// we determine if we need to use subject
117
118 return 0;
119 }
120 }
121 }
122
123
2 {
3 using System;
4 using System.Threading;
5
6 /// <SUMMARY></SUMMARY>
7 /// Summary description for Client.
8 ///
9 abstract class CommonSubject
10 {
11 abstract public void Request();
12 }
13
14 class ActualSubject : CommonSubject
15 {
16 public ActualSubject()
17 {
18 // Assume constructor here does some operation that takes quite a
19 // while - hence the need for a proxy - to delay incurring this
20 // delay until (and if) the actual subject is needed
21 Console.WriteLine("Starting to construct ActualSubject");
22 Thread.Sleep(1000); // represents lots of processing!
23 Console.WriteLine("Finished constructing ActualSubject");
24 }
25
26 override public void Request()
27 {
28 Console.WriteLine("Executing request in ActualSubject");
29 }
30 }
31
32 class Proxy : CommonSubject
33 {
34 ActualSubject actualSubject;
35
36 override public void Request()
37 {
38 if (actualSubject == null)
39 actualSubject = new ActualSubject();
40 actualSubject.Request();
41 }
42
43 }
44
45 public class Client
46 {
47 public static int Main(string[] args)
48 {
49 Proxy p = new Proxy();
50
51 // Perform actions here
52 // . . .
53
54 if (1 == 1) // at some later point, based on a condition,
55 p.Request();// we determine if we need to use subject
56
57 return 0;
58 }
59 }
60 }
61
62 namespace Proxy_DesignPattern
63 {
64 using System;
65 using System.Threading;
66
67 ///
68 /// Summary description for Client.
69 ///
70 abstract class CommonSubject
71 {
72 abstract public void Request();
73 }
74
75 class ActualSubject : CommonSubject
76 {
77 public ActualSubject()
78 {
79 // Assume constructor here does some operation that takes quite a
80 // while - hence the need for a proxy - to delay incurring this
81 // delay until (and if) the actual subject is needed
82 Console.WriteLine("Starting to construct ActualSubject");
83 Thread.Sleep(1000); // represents lots of processing!
84 Console.WriteLine("Finished constructing ActualSubject");
85 }
86
87 override public void Request()
88 {
89 Console.WriteLine("Executing request in ActualSubject");
90 }
91 }
92
93 class Proxy : CommonSubject
94 {
95 ActualSubject actualSubject;
96
97 override public void Request()
98 {
99 if (actualSubject == null)
100 actualSubject = new ActualSubject();
101 actualSubject.Request();
102 }
103
104 }
105
106 public class Client
107 {
108 public static int Main(string[] args)
109 {
110 Proxy p = new Proxy();
111
112 // Perform actions here
113 // . . .
114
115 if (1 == 1) // at some later point, based on a condition,
116 p.Request();// we determine if we need to use subject
117
118 return 0;
119 }
120 }
121 }
122
123
--------------------------------------------------------------------------------
最后的舞台还是留给Delphi了.
1 type
2 ICommRequest = interface
3 procedure Request;
4 end;
5
6 TActualRequest = class(TInterfacedObject,ICommRequest)
7 public
8 procedure Request;
9 end;
10
11 TProxy = class(TInterfacedObject,ICommRequest)
12 private
13 FRealRequest:TActualRequest;
14 public
15 procedure Request;
16 property RealRequest:TActualRequest read FRealRequest write FRealRequest;
17 end;
18
19 { TProxy }
20
21 procedure TProxy.Request;
22 begin
23 if Assigned(RealRequest) then
24 begin
25 Writeln('Proxy!');
26 RealRequest.Request;
27 end;
28 end;
29
30 { TActualRequest }
31
32 procedure TActualRequest.Request;
33 begin
34 Writeln('Actual Request');
35 end;
36
37 var
38 tmp:string;
39 P:TProxy;
40 A:TActualRequest;
41 begin
42 P:=TProxy.Create;
43 A:=TActualRequest.Create;
44 try
45 P.RealRequest:=A;
46 P.Request;
47 Readln(tmp);
48 finally
49 A.Free;
50 P.Free;
51 end;
52 end.
53
2 ICommRequest = interface
3 procedure Request;
4 end;
5
6 TActualRequest = class(TInterfacedObject,ICommRequest)
7 public
8 procedure Request;
9 end;
10
11 TProxy = class(TInterfacedObject,ICommRequest)
12 private
13 FRealRequest:TActualRequest;
14 public
15 procedure Request;
16 property RealRequest:TActualRequest read FRealRequest write FRealRequest;
17 end;
18
19 { TProxy }
20
21 procedure TProxy.Request;
22 begin
23 if Assigned(RealRequest) then
24 begin
25 Writeln('Proxy!');
26 RealRequest.Request;
27 end;
28 end;
29
30 { TActualRequest }
31
32 procedure TActualRequest.Request;
33 begin
34 Writeln('Actual Request');
35 end;
36
37 var
38 tmp:string;
39 P:TProxy;
40 A:TActualRequest;
41 begin
42 P:=TProxy.Create;
43 A:=TActualRequest.Create;
44 try
45 P.RealRequest:=A;
46 P.Request;
47 Readln(tmp);
48 finally
49 A.Free;
50 P.Free;
51 end;
52 end.
53
好的.其实这个模式很简单,希望对大家有帮助.