《GOF设计模式》—代理(PROXY)—Delphi源码示例:智能指引(Smart Reference)

示例:智能指引(Smart Reference

说明:

取代了简单的指针,它在访问对象时执行一些附加操作。

它的典型用途包括:

*对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为Smart Pointers[Ede92])

*当第一次引用一个持久对象时,将它装入内存。

*在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。

ProtectionProxiesSmartReference都允许在访问一个对象时有一些附加的内务处理(Housekeeping task)。

 

代码:

unit uSmartReference;

 

interface

 

uses

    SysUtils,Dialogs,SyncObjs;

 

type

    TSubject = class

    public

        procedure Request; virtual; abstract;

    end;

    TRealSubject = class(TSubject)

    private

        FRefCount: Integer;

        FLock: TCriticalSection;

    public

        constructor Create;

        destructor Destroy; override;

        //---

        procedure AddRef;

        procedure Release;

        procedure Lock;

        procedure UnLock;

        //---

        procedure Request; override;

        //---

        property RefCount: Integer read FRefCount;

    end;

    TProxy = class(TSubject)

    private

        FSubject: TRealSubject;

        function GetSubject: TRealSubject;

        procedure SetSubject(const Value: TRealSubject);

    public

        constructor Create;

        destructor Destroy; override;

        //---

        procedure Request; override;

        //---

        property Subject: TRealSubject read GetSubject write SetSubject;

    end;

 

implementation

 

constructor TRealSubject.Create;

begin

    FRefCount := 0;

    FLock := TCriticalSection.Create;

end;

 

destructor TRealSubject.Destroy;

begin

    FLock.Free;

    //---

    inherited;

end;

 

procedure TRealSubject.Lock;

begin

    FLock.Enter;

end;

 

procedure TRealSubject.UnLock;

begin

    FLock.Leave;

end;

 

procedure TRealSubject.AddRef;

begin

    inc(FRefCount);

end;

 

procedure TRealSubject.Release;

begin

    dec(FRefCount);

end;

 

procedure TRealSubject.Request;

begin

    ShowMessage('RealSubject');

end;

 

constructor TProxy.Create;

begin

    FSubject := nil;

end;

 

destructor TProxy.Destroy;

begin

    self.Subject := nil;

    //---

    inherited;

end;

 

function TProxy.GetSubject: TRealSubject;

begin

    if not assigned(FSubject) then

    begin

        FSubject := TRealSubject.Create;

        FSubject.AddRef;

    end;

    //---

    Result := FSubject;

end;

 

procedure TProxy.SetSubject(const Value: TRealSubject);

begin

    if FSubject <> Value then

    begin

        if Assigned(FSubject) then

        begin

            FSubject.Release;

            if FSubject.RefCount = 0 then

                FreeAndNil(FSubject);

        end;

        //---

        FSubject := Value;

        if Assigned(FSubject) then

            FSubject.AddRef;

    end;

end;

 

procedure TProxy.Request;

begin

    with self.Subject do

    begin

        Lock;

        try

            Request;

        finally

            UnLock;

        end;

    end;

end;

 

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

    ASubject1,ASubject2: TProxy;

begin

    ASubject1 := TProxy.Create;

    ASubject2 := TProxy.Create;

    try

        ASubject1.Request;

        //---

        ASubject2.Subject := ASubject1.Subject;

        ASubject2.Request;

    finally

        ASubject1.Free;

        ASubject2.Free;

    end;

end;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值