《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:观察者接口
来源:互联网 发布:mac版qq查看群相册 编辑:程序博客网 时间:2024/04/18 07:29
示例:观察者接口
说明:
(1)、定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
(2)、结构
目标
Subject(目标):目标知道它的观察者。可以有任意多个观察者观察同一个目标。提供注册和删除观察者对象的接口。
ConcreteSubject(具体目标):将有关状态存入各ConcreteObserver对象。当它的状态发生改变时,向它的各个观察者发出通知。
观察者
Observer(观察者):为那些在目标发生改变时需获得通知的对象定义一个更新接口。
ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用。存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。
代码:
unit uObserver2;
interface
uses
SysUtils, Classes,Dialogs;
type
TSubject = class;
TObserver = class
public
procedure Update; virtual; abstract;
end;
TConcreteObserver = class(TObserver)
private
FSubject: TSubject;
FState: Integer;
public
constructor Create(ASubject: TSubject);
destructor Destroy; override;
//---
procedure Update; override;
end;
TSubject = class
private
FObservers: TList;
public
constructor Create;
destructor Destroy; override;
//---
procedure Attach(AObserver: TObserver);
procedure Detach(AObserver: TObserver);
procedure Notify();
end;
TConcreteSubject = class(TSubject)
private
FState: Integer;
function GetState: Integer;
procedure SetState(const Value: Integer);
public
property State: Integer read GetState write SetState;
end;
procedure Test;
implementation
procedure Test;
var
ASubject: TConcreteSubject;
AObserver: TObserver;
begin
ASubject := TConcreteSubject.Create;
AObserver := TConcreteObserver.Create(ASubject);
try
ASubject.State := 123;
finally
AObserver.Free;
ASubject.Free;
end;
end;
constructor TSubject.Create;
begin
inherited;
//---
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;
end;
end;
constructor TConcreteObserver.Create(ASubject: TSubject);
begin
inherited Create;
//---
FSubject := ASubject;
FSubject.Attach(self);
end;
destructor TConcreteObserver.Destroy;
begin
FSubject.Detach(self);
//---
inherited;
end;
procedure TConcreteObserver.Update;
begin
FState := TConcreteSubject(FSubject).State;
ShowMessage(IntToStr(FState));
end;
function TConcreteSubject.GetState: Integer;
begin
Result := FState;
end;
procedure TConcreteSubject.SetState(const Value: Integer);
begin
FState := Value;
//---
Self.Notify;
end;
end.
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:观察者接口
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:图形用户界面工具箱
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:推模型(push model)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:拉模型(pull model)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:封装复杂的更新语义
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:时钟
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:图形用户界面工具箱
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:显式地指定感兴趣的改变
- 《GOF设计模式》—中介者 (MEDIATOR)—Delphi源码示例:Colleague—Mediator通信(使用观察者模式)
- GOF设计模式之OBSERVER(观察者)
- GOF 23 设计模式之 观察者模式(Observer)
- 设计模式—观察者模式(Observer)
- Java设计模式—观察者(Observer)
- 《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:适配器接口
- 《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:桥接接口
- 《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:组合接口
- 《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:最大化Component接口
- 《GOF设计模式》—装饰(DECORATOR)—Delphi源码示例:装饰接口
- 使用Doxgen创建Xcode文档集
- asp.net 将数据导入到excel中 出现 “object”未包含“get_Range”的定义
- 《GOF设计模式》—备忘录(MEMENTO)—Delphi源码示例:一个反映备忘录模式的迭代接口
- google发布的gtv的js ui库
- 深入C++ Builder之编写自己的元件(1)
- 《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:观察者接口
- 马化腾周鸿祎把酒言欢
- 序列化和反序列化
- MPI并行计算环境的建立
- 表达式树
- log4j配置祥解
- 深入C++ Builder之编写自己的元件(2)
- CSS 定位时一定要用的 style clear=both
- 为了安全起见,密码框不能选取,复制,粘贴