示例:远程代理(Remote Proxy)
说明:
为一个对象在不同的地址空间提供局部代表(相当于主机实际对象<—>用户机映射对象,对映射对象操作传递给主机实际对象)。
Remote Proxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。
代码:
unit uRemoteProxy;
interface
uses
SysUtils,Dialogs,ScktComp;
type
TSubject = class
public
procedure Request; virtual; abstract;
end;
TRealSubject = class(TSubject)
private
FServerSocket: TServerSocket;
FCurClientSocket: TCustomWinSocket;
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
public
constructor Create;
destructor Destroy; override;
//---
procedure Request; override;
end;
TProxy = class(TSubject)
private
FClientSocket: TClientSocket;
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
public
constructor Create(const IP: string);
destructor Destroy; override;
//---
procedure Request; override;
end;
implementation
constructor TRealSubject.Create;
begin
FServerSocket := TServerSocket.Create(nil);
with FServerSocket do
begin
Port := 1028;
Active := True;
//---
OnClientRead := self.ServerSocketClientRead;
end;
end;
destructor TRealSubject.Destroy;
begin
with FServerSocket do
begin
Close;
Free;
end;
//---
inherited;
end;
procedure TRealSubject.ServerSocketClientRead(Sender: TObject; Socket:
TCustomWinSocket);
var
AReceiveText: string;
begin
FCurClientSocket := Socket;
//---
AReceiveText := FCurClientSocket.ReceiveText;
if AReceiveText = 'Request' then
self.Request;
end;
procedure TRealSubject.Request;
begin
FCurClientSocket.SendText('12345');
end;
constructor TProxy.Create(const IP: string);
begin
FClientSocket := TClientSocket.Create(nil);
with FClientSocket do
begin
Host := IP;
Port := 1028;
Active := false;
//---
OnRead := self.ClientSocketRead;
end;
end;
destructor TProxy.Destroy;
begin
with FClientSocket do
begin
Close;
Free;
end;
//---
inherited;
end;
procedure TProxy.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage(Socket.ReceiveText);
end;
procedure TProxy.Request;
begin
if not FClientSocket.Active then
FClientSocket.Active := true;
//---
FClientSocket.Socket.SendText('Request');
end;
end.
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
Dialogs,StdCtrls,ExtCtrls,uRemoteProxy;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FRemoteSubject: TSubject;
FLocalSubject: TSubject;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FRemoteSubject := TRealSubject.Create;
FLocalSubject := TProxy.Create('127.0.0.1');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FRemoteSubject.Free;
FLocalSubject.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FLocalSubject.Request;
end;
end.