《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:推模型(push model)
来源:互联网 发布:编程四大魔道天才 编辑:程序博客网 时间:2024/04/25 20:03
示例:推模型(push model)
说明:
目标向观察者发送关于改变的详细信息,而不管它们需要与否。
代码:
unit uPushModel;
interface
uses
SysUtils, Classes, Dialogs;
type
TSubjectState = record
A,B:Integer;
end;
TObserver = class;
TSubject = class
private
FObservers: TList;
FState: TSubjectState;
public
constructor Create;
destructor Destroy; override;
//---
procedure Attach(AObserver: TObserver);
procedure Detach(AObserver: TObserver);
procedure Notify;
end;
TConcreteSubject = class(TSubject)
private
function GetA: Integer;
function GetB: Integer;
procedure SetA(const Value: Integer);
procedure SetB(const Value: Integer);
public
property A: Integer read GetA write SetA;
property B: Integer read GetB write SetB;
end;
TObserver = class
public
procedure Update(AState: TSubjectState); virtual; abstract;
end;
TConcreteObserver = class(TObserver)
protected
FSubject: TSubject;
public
constructor Create(ASubject: TSubject);
destructor Destroy; override;
//---
procedure Update(AState: TSubjectState); override;
end;
procedure Test;
implementation
procedure Test;
var
ASubject: TConcreteSubject;
AObserver: TObserver;
begin
ASubject := TConcreteSubject.Create;
AObserver := TConcreteObserver.Create(ASubject);
try
ASubject.A := 1;
ASubject.B := 2;
ASubject.Notify;
finally
AObserver.Free;
ASubject.Free;
end;
end;
constructor TSubject.Create;
begin
FObservers := TList.Create;
end;
destructor TSubject.Destroy;
begin
FObservers.Free;
//---
inherited;
end;
procedure TSubject.Attach(AObserver: TObserver);
begin
FObservers.Add(AObserver);
end;
procedure TSubject.Detach(AObserver: TObserver);
begin
FObservers.Remove(AObserver);
end;
procedure TSubject.Notify;
var
i: integer;
begin
with FObservers do
begin
for i := 0 to Count - 1 do
TObserver(Items[i]).Update(FState);
end;
end;
constructor TConcreteObserver.Create(ASubject: TSubject);
begin
FSubject := ASubject;
if FSubject <> nil then FSubject.Attach(self);
end;
destructor TConcreteObserver.Destroy;
begin
if FSubject <> nil then FSubject.Detach(self);
//---
inherited;
end;
procedure TConcreteObserver.Update(AState: TSubjectState);
begin
ShowMessage(IntToStr(AState.A + AState.B))
end;
function TConcreteSubject.GetA: Integer;
begin
Result := FState.A;
end;
function TConcreteSubject.GetB: Integer;
begin
Result := FState.B;
end;
procedure TConcreteSubject.SetA(const Value: Integer);
begin
FState.A := Value;
end;
procedure TConcreteSubject.SetB(const Value: Integer);
begin
FState.B := Value;
end;
end.
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:推模型(push model)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:拉模型(pull model)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:观察者接口
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:图形用户界面工具箱
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:封装复杂的更新语义
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:时钟
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:图形用户界面工具箱
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:显式地指定感兴趣的改变
- 《GOF设计模式》—中介者 (MEDIATOR)—Delphi源码示例:Colleague—Mediator通信(使用观察者模式)
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:远程代理(Remote Proxy)
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:保护代理(Protection Proxy)
- 《GOF设计模式》—代理(PROXY)—Delphi源码示例:智能指引(Smart Reference)
- 《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:适配器接口
- 《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:绘图编辑器
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:桥接接口
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:仅有一个Implementor
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:共享Implementor对象
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:图形用户界面工具箱
- 深入C++ Builder之编写自己的元件(3)
- 简单设置让网页浏览更安全
- 根据日志不同级别,进行配置输出
- oracle blob数据存取(转)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:推模型(push model)
- Mysql LOG
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:拉模型(pull model)
- POJ 1475 Pushing Boxes 推箱子游戏
- QTP的DataTable操作整理
- 技术回归之路第一天——阅读面试题大全
- 式
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:显式地指定感兴趣的改变
- excle数据库blob处理(转)