今天说一下代理模式.
从名字看大家都知道了代理模式,就是一个让一个类来帮你干某些事.是吧?嘿嘿.当然开始之前我们还是惯例来看看这个设计模式的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
好的.其实这个模式很简单,希望对大家有帮助.