使用Observer模式设计信息更新功能
2005-10-26 09:52
393 查看
在一个软件项目中,有一个这样的需求,软件首页列出待处理消息的个数,点击进入处理窗体,处理后,刷新首页的消息个数。从软件设计来说,消息处理类并不需要知道是哪里需要刷新,可以是首页,也可以是别的地方,或者同时多个地方。因此打算采用Observer模式。先设计出类图:TMsg是消息处理类,它通过LoadMsgs得到待处理消息,RegisteNewMsg方法注册观察者,UnregisterNewMsg移除观察者,现在消息处理后,能及时通知观察者进行更新了。{----------------------------------------------------------------------------- Unit Name: untMsgs Author: bohe Purpose: History:-----------------------------------------------------------------------------}
unit untMsgs;
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, MstProxyObj, Forms, Dialogs, DBClient, variants, contnrs, StdCtrls;
type TMsg = class(TObject) private FReadedMsgCount: Integer; FNewMsgCount: Integer; fSenderCode: string; fcdsNewMsg: TClientDataSet; fcdsReadedMsg: TClientDataSet; function GetAllMsgCount: Integer; virtual; procedure SetNewMsgCount(Value: Integer); virtual; //function GetvAllMsgData: OleVariant; function GetvNewMsgData: OleVariant; function GetvReadedMsgData: OleVariant; protected fAllMsgCount: integer; //fcdsMsg: TClientDataSet; fEduMstObj: TMstEduProxyObj; vMsgData: OLEVariant; FNewMsgReaderList: TObjectList; FReadedMsgReaderList: TObjectList; //property cdsMsg: TClientDataSet read fcdsMsg; procedure NotifyChange(ReaderList: TObjectList; Value: integer); public property vNewMsgData: OleVariant read GetvNewMsgData; //property vAllMsgData: OleVariant read GetvAllMsgData; property vReadedMsgData: OleVariant read GetvReadedMsgData;
constructor Create(sSenderCode: string; EduMstObj: TMstEduProxyObj); destructor Destroy; procedure LoadMsgs; virtual; abstract; property AllMsgCount: Integer read GetAllMsgCount; property NewMsgCount: Integer read FNewMsgCount; //write SetNewMsgCount; property ReadedMsgCount: Integer read FReadedMsgCount; procedure RegisterNewMsg(Reader: TCustomLabel); procedure RegisterReadedMsg(Reader: TCustomLabel); procedure UnregisterNewMsg(Reader: TCustomLabel); function GetMsgCode(MsgID: integer): integer; procedure SetMsgReaded(MsgID: integer); end; TBurMsg = class(TMsg) public procedure LoadMsgs; override; end; TSchMsg = class(TMsg) public procedure LoadMsgs; override; end;
var SchMsg: TSchMsg; BurMsg: TBurMsg;
implementation
uses DB, untConst;
{*************************************TMsg*********************************}constructor TMsg.Create(sSenderCode: string; EduMstObj: TMstEduProxyObj);begin fEduMstObj := EduMstObj; fSenderCode := sSenderCode; //fcdsMsg := TClientDataSet.Create(nil); fcdsNewMsg := TClientDataSet.Create(nil); fcdsReadedMsg := TClientDataSet.Create(nil); vMsgData := null; FNewMsgReaderList := TObjectList.Create; FNewMsgReaderList.OwnsObjects := false; FReadedMsgReaderList := TObjectList.Create; FReadedMsgReaderList.OwnsObjects := false; LoadMsgs;end;
destructor TMsg.Destroy;begin //fcdsMsg.close; //fcdsMsg.Free; //fcdsNewMsg.Close; fcdsNewMsg.Free; fcdsReadedMsg.Free; FNewMsgReaderList.Free; FReadedMsgReaderList.Free;end;
function TMsg.GetAllMsgCount: Integer;begin Result := fAllMsgCount; //;NewMsgCount + ReadedMsgCount;end;
function TMsg.GetMsgCode(MsgID: integer): integer;begin Result := -1; if fcdsNewMsg.Locate('id',MsgID,[]) then Result := fcdsNewMsg.fieldByName('Msg_Code').AsInteger else if fcdsReadedMsg.Locate('id',MsgID,[]) then Result := fcdsReadedMsg.fieldByName('Msg_Code').AsInteger;end;
function TMsg.GetvNewMsgData: OleVariant;begin Result := fcdsNewMsg.Data;end;
function TMsg.GetvReadedMsgData: OleVariant;begin Result := fcdsReadedMsg.Data;end;
procedure TMsg.NotifyChange(ReaderList: TObjectList; Value: integer);var i: integer;begin for i := 0 to ReaderList.Count -1 do begin if assigned(ReaderList[i]) then (ReaderList[i] as TCustomLabel).Caption := IntToStr(Value); end;end;
procedure TMsg.RegisterNewMsg(Reader: TCustomLabel);begin Reader.Caption := IntToStr(FNewMsgCount); FNewMsgReaderList.Add(Reader);end;
procedure TMsg.RegisterReadedMsg(Reader: TCustomLabel);begin Reader.Caption := IntToStr(FReadedMsgCount); FReadedMsgReaderList.Add(Reader);end;
procedure TMsg.SetMsgReaded(MsgID: integer);var i: integer;begin if not fEduMstObj.ProxyObj.ReadAMsg(MsgID) then raise Exception.Create('设置消息已读属性失败!'); if fcdsNewMsg.Locate('id',msgid,[]) then begin //将新消息里的记录插入到已读消息记录里 fcdsReadedMsg.Insert; for i := 0 to fcdsNewMsg.FieldCount - 1 do fcdsReadedMsg.Fields[i].Value := fcdsNewMsg.Fields[i].Value; fcdsReadedMsg.Post; fcdsNewMsg.Delete; //删除新生表里的记录 fNewMsgCount := fcdsNewMsg.RecordCount; NotifyChange(FNewMsgReaderList,fNewMsgCount); fReadedMsgCount := fcdsReadedMsg.RecordCount; NotifyChange(FReadedMsgReaderList,fReadedMsgCount); end;end;
procedure TMsg.SetNewMsgCount(Value: Integer);begin
end;
procedure TMsg.UnregisterNewMsg(Reader: TCustomLabel);var idx: integer;begin idx := FNewMsgReaderList.IndexOf(Reader); if idx>=0 then FNewMsgReaderList.Delete(idx);
end;
end.
unit untMsgs;
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, MstProxyObj, Forms, Dialogs, DBClient, variants, contnrs, StdCtrls;
type TMsg = class(TObject) private FReadedMsgCount: Integer; FNewMsgCount: Integer; fSenderCode: string; fcdsNewMsg: TClientDataSet; fcdsReadedMsg: TClientDataSet; function GetAllMsgCount: Integer; virtual; procedure SetNewMsgCount(Value: Integer); virtual; //function GetvAllMsgData: OleVariant; function GetvNewMsgData: OleVariant; function GetvReadedMsgData: OleVariant; protected fAllMsgCount: integer; //fcdsMsg: TClientDataSet; fEduMstObj: TMstEduProxyObj; vMsgData: OLEVariant; FNewMsgReaderList: TObjectList; FReadedMsgReaderList: TObjectList; //property cdsMsg: TClientDataSet read fcdsMsg; procedure NotifyChange(ReaderList: TObjectList; Value: integer); public property vNewMsgData: OleVariant read GetvNewMsgData; //property vAllMsgData: OleVariant read GetvAllMsgData; property vReadedMsgData: OleVariant read GetvReadedMsgData;
constructor Create(sSenderCode: string; EduMstObj: TMstEduProxyObj); destructor Destroy; procedure LoadMsgs; virtual; abstract; property AllMsgCount: Integer read GetAllMsgCount; property NewMsgCount: Integer read FNewMsgCount; //write SetNewMsgCount; property ReadedMsgCount: Integer read FReadedMsgCount; procedure RegisterNewMsg(Reader: TCustomLabel); procedure RegisterReadedMsg(Reader: TCustomLabel); procedure UnregisterNewMsg(Reader: TCustomLabel); function GetMsgCode(MsgID: integer): integer; procedure SetMsgReaded(MsgID: integer); end; TBurMsg = class(TMsg) public procedure LoadMsgs; override; end; TSchMsg = class(TMsg) public procedure LoadMsgs; override; end;
var SchMsg: TSchMsg; BurMsg: TBurMsg;
implementation
uses DB, untConst;
{*************************************TMsg*********************************}constructor TMsg.Create(sSenderCode: string; EduMstObj: TMstEduProxyObj);begin fEduMstObj := EduMstObj; fSenderCode := sSenderCode; //fcdsMsg := TClientDataSet.Create(nil); fcdsNewMsg := TClientDataSet.Create(nil); fcdsReadedMsg := TClientDataSet.Create(nil); vMsgData := null; FNewMsgReaderList := TObjectList.Create; FNewMsgReaderList.OwnsObjects := false; FReadedMsgReaderList := TObjectList.Create; FReadedMsgReaderList.OwnsObjects := false; LoadMsgs;end;
destructor TMsg.Destroy;begin //fcdsMsg.close; //fcdsMsg.Free; //fcdsNewMsg.Close; fcdsNewMsg.Free; fcdsReadedMsg.Free; FNewMsgReaderList.Free; FReadedMsgReaderList.Free;end;
function TMsg.GetAllMsgCount: Integer;begin Result := fAllMsgCount; //;NewMsgCount + ReadedMsgCount;end;
function TMsg.GetMsgCode(MsgID: integer): integer;begin Result := -1; if fcdsNewMsg.Locate('id',MsgID,[]) then Result := fcdsNewMsg.fieldByName('Msg_Code').AsInteger else if fcdsReadedMsg.Locate('id',MsgID,[]) then Result := fcdsReadedMsg.fieldByName('Msg_Code').AsInteger;end;
function TMsg.GetvNewMsgData: OleVariant;begin Result := fcdsNewMsg.Data;end;
function TMsg.GetvReadedMsgData: OleVariant;begin Result := fcdsReadedMsg.Data;end;
procedure TMsg.NotifyChange(ReaderList: TObjectList; Value: integer);var i: integer;begin for i := 0 to ReaderList.Count -1 do begin if assigned(ReaderList[i]) then (ReaderList[i] as TCustomLabel).Caption := IntToStr(Value); end;end;
procedure TMsg.RegisterNewMsg(Reader: TCustomLabel);begin Reader.Caption := IntToStr(FNewMsgCount); FNewMsgReaderList.Add(Reader);end;
procedure TMsg.RegisterReadedMsg(Reader: TCustomLabel);begin Reader.Caption := IntToStr(FReadedMsgCount); FReadedMsgReaderList.Add(Reader);end;
procedure TMsg.SetMsgReaded(MsgID: integer);var i: integer;begin if not fEduMstObj.ProxyObj.ReadAMsg(MsgID) then raise Exception.Create('设置消息已读属性失败!'); if fcdsNewMsg.Locate('id',msgid,[]) then begin //将新消息里的记录插入到已读消息记录里 fcdsReadedMsg.Insert; for i := 0 to fcdsNewMsg.FieldCount - 1 do fcdsReadedMsg.Fields[i].Value := fcdsNewMsg.Fields[i].Value; fcdsReadedMsg.Post; fcdsNewMsg.Delete; //删除新生表里的记录 fNewMsgCount := fcdsNewMsg.RecordCount; NotifyChange(FNewMsgReaderList,fNewMsgCount); fReadedMsgCount := fcdsReadedMsg.RecordCount; NotifyChange(FReadedMsgReaderList,fReadedMsgCount); end;end;
procedure TMsg.SetNewMsgCount(Value: Integer);begin
end;
procedure TMsg.UnregisterNewMsg(Reader: TCustomLabel);var idx: integer;begin idx := FNewMsgReaderList.IndexOf(Reader); if idx>=0 then FNewMsgReaderList.Delete(idx);
end;
end.
相关文章推荐
- VB6.0中提示:该部件的许可证信息没有找到,在设计环境中,没有合适的许可证使用该功能”的解决办法
- 使用Dispatch模式设计信息上报审批功能
- PageAdmin V2.1 20100101版本已发布,请更新到最新版本使用更多功能。
- 经典vim插件功能说明、安装方法和使用方法介绍(已更新)
- 腾讯 iweibo Java API 1.2.1 补充头像和个人信息更新功能接口
- IOS-使用framework实现功能模块动态更新
- 经典vim插件功能说明、安装方法和使用方法介绍(已更新)
- sql,scope_identity,procedure,tran,substring,cast,convert,charindex,插入角色的同时插入角色拥有的权限,权限使用权限列表表示,列表用逗号分隔权限的id,更新角色信息,同时更新权限信息
- 基于Qt/Embedded的物流信息终端导航定位功能设计
- 手机地图更新功能设计分析
- 使用Sparkle为OS X App添加自动更新功能
- javascript使用中的一些小功能总结(持续更新中)
- 【视频】配置信息管理 的 使用方法(四):功能节点维护
- 如何使用三层架构设计模式去完整的实现一个功能?
- 信息更新小红点显示——自定义控件BadgeView的使用介绍
- 使用Qtip2来开发功能强大的删除和信息提示功能
- [Conponent]PCB设计中一些元器件的选择与使用事项_不断更新
- 经典vim插件功能说明、安装方法和使用方法介绍(已更新)
- Selenium2Library使用Remote功能(转载并更新)
- 经典vim插件功能说明、安装方法和使用方法介绍(已更新)