开发应用-观察者模式之C#实现缓存数据更新
开发应用-观察者模式之C#实现缓存数据更新
我们在开发大型基于数据库管理应用系统时,会用到大量的缓存数据,这样能提高软件系统的性能,使用缓存数据带来便利的同时,也会因为用户更新了原始数据,如增、删、改导致缓存数据不同步更新,变成了旧数据、脏数据!
我们在开发大型基于数据库管理应用系统时,会用到大量的缓存数据,这样能提高软件系统的性能,使用缓存数据带来便利的同时,也会因为用户更新了原始数据,如增、删、改导致缓存数据不同步更新,变成了旧数据、脏数据!
如何能同步更新缓存数据呢?
我想大家都会遇到这个问题,特整理了一套方案仅供参考:
观察者模式(Observer Facade Pattern)
定义一组观察者,他们时刻监视用户对原始数据的操作。
观察者模式接口
具体数据的业务逻辑层
/// <summary>
/// 观察者模式接口
/// </summary>
public interface IObserver
{
//仅一个方法,通知(Notify)观察者接收到消息
void Notify();
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 货币资料业务逻辑
///
///
/// </summary>
public class CurrencyData
{
private DataTable _Data; //货币数据,缓存数据
private IList _Observers = new ArrayList();//货币资料的观察者(1...n)
private string _xml = Application.StartupPath @"\data\currency.xml";
public DataTable DataSource { get { return _Data; } }
public void CreateTable()
{
_Data = new DataTable("Currency");
if (File.Exists(_xml))
_Data.ReadXml(_xml);
else
{
_Data.Columns.Add("CurrencyCode", typeof(string));
}
}
public void AddCurrency(string code)
{
_Data.LoadDataRow(new object[] { code }, true);
_Data.AcceptChanges(); //更新缓存的数据
_Data.WriteXml(_xml, XmlWriteMode.WriteSchema);//保存到文件
this.NotifyObservers();//通知所有观察者刷新数据
}
public void DeleteCurrency(string code)
{
DataRow[] rows = _Data.Select("CurrencyCode='" code "'");
if (rows.Length > 0) rows[0].Delete();
_Data.AcceptChanges();//更新缓存的数据
_Data.WriteXml(_xml, XmlWriteMode.WriteSchema); //保存到文件
this.NotifyObservers();//通知所有观察者刷新数据
}
/// <summary>
/// 通知所有观察者
/// </summary>
private void NotifyObservers()
{
foreach (IObserver o in _Observers) o.Notify();
}
/// <summary>
/// 登记观察者
/// </summary>
/// <param name="observers">观察者列表(1..n)</param>
public void RegisterObserver(IList observers)
{
foreach (IObserver o in observers)
{
//if (o is ObserverCurrency) _Observers.Add(o);
_Observers.Add(o);
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
扫一扫加微信
观察者模式(Observer Facade Pattern)
定义一组观察者,他们时刻监视用户对原始数据的操作。
观察者模式接口
具体数据的业务逻辑层
/// <summary>
/// 观察者模式接口
/// </summary>
public interface IObserver
{
//仅一个方法,通知(Notify)观察者接收到消息
void Notify();
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 支持数据字典观察者的窗体,比如PO,PN等业务窗体
/// Lookup功能视为数据字典观察者
/// </summary>
public interface IObserverSupportable
{
//获取观察者列表, 通常业务窗体内会对应多个数据字典表
IList GetObservers();
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 支持数据字典观察者的窗体,比如PO,PN等业务窗体
/// Lookup功能视为数据字典观察者
/// </summary>
public interface IObserverSupportable
{
//获取观察者列表, 通常业务窗体内会对应多个数据字典表
IList GetObservers();
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 数据字典窗体
/// </summary>
public interface IObserverDataDictForm
{
//
//注册观察者,当字典数据改变时通知所有观察者同步更新数据.
//
//一个数据字典可能会关联多个业务窗体.比如货币字典会在采购窗体和窗体内使用.
//因此,当字典数据改变时要通知采购窗体和窗体刷新数据.
//
void RegisterObserver(IList observers);
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 数据字典窗体
/// </summary>
public interface IObserverDataDictForm
{
//
//注册观察者,当字典数据改变时通知所有观察者同步更新数据.
//
//一个数据字典可能会关联多个业务窗体.比如货币字典会在采购窗体和窗体内使用.
//因此,当字典数据改变时要通知采购窗体和窗体刷新数据.
//
void RegisterObserver(IList observers);
}
// 来源:www.CSFramework.com, C/S结构框架学习网
public class ObserverAdd : IObserver
{
private ListBox _Monitor;
public ObserverAdd(ListBox monitor)
{
_Monitor = monitor;
}
public void Notify()
{
_Monitor.Items.Add("观察到新增记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
{
private ListBox _Monitor;
public ObserverAdd(ListBox monitor)
{
_Monitor = monitor;
}
public void Notify()
{
_Monitor.Items.Add("观察到新增记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
public class ObserverDelete : IObserver
{
private ListBox _Monitor;
public ObserverDelete(ListBox monitor)
{
_Monitor = monitor;
}
public void Notify()
{
_Monitor.Items.Add("观察到删除记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
{
private ListBox _Monitor;
public ObserverDelete(ListBox monitor)
{
_Monitor = monitor;
}
public void Notify()
{
_Monitor.Items.Add("观察到删除记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 同步刷新货币数据字典的观察者
/// </summary>
public class ObserverCurrency : IObserver
{
private ComboBox _CurrencyData;
private ListBox _log;
public ObserverCurrency(ComboBox comboBox, ListBox log)
{
_CurrencyData = comboBox;
_log = log;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\currency.xml");
_CurrencyData.DataSource = null;
_CurrencyData.DisplayMember = "CurrencyCode";
_CurrencyData.ValueMember = "CurrencyCode";
_CurrencyData.DataSource = dt;//绑定数据源
_log.Items.Add("客户窗体刚才通知了观察者!");
_log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 同步刷新货币数据字典的观察者
/// </summary>
public class ObserverCurrency : IObserver
{
private ComboBox _CurrencyData;
private ListBox _log;
public ObserverCurrency(ComboBox comboBox, ListBox log)
{
_CurrencyData = comboBox;
_log = log;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\currency.xml");
_CurrencyData.DataSource = null;
_CurrencyData.DisplayMember = "CurrencyCode";
_CurrencyData.ValueMember = "CurrencyCode";
_CurrencyData.DataSource = dt;//绑定数据源
_log.Items.Add("客户窗体刚才通知了观察者!");
_log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 同步刷新客户数据字典的观察者
/// </summary>
public class ObserverCustomer : IObserver
{
private ComboBox _CustomerData;
private ListBox _log;
public ObserverCustomer(ComboBox comboBox, ListBox log)
{
_CustomerData = comboBox;
_log = log;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\customer.xml");
_CustomerData.DataSource = null;
_CustomerData.DisplayMember = "CustomerCode";
_CustomerData.ValueMember = "CustomerCode";
_CustomerData.DataSource = dt;
_log.Items.Add("客户窗体刚才通知了观察者!");
_log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// 同步刷新客户数据字典的观察者
/// </summary>
public class ObserverCustomer : IObserver
{
private ComboBox _CustomerData;
private ListBox _log;
public ObserverCustomer(ComboBox comboBox, ListBox log)
{
_CustomerData = comboBox;
_log = log;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\customer.xml");
_CustomerData.DataSource = null;
_CustomerData.DisplayMember = "CustomerCode";
_CustomerData.ValueMember = "CustomerCode";
_CustomerData.DataSource = dt;
_log.Items.Add("客户窗体刚才通知了观察者!");
_log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
public class ObserverUnit : IObserver
{
private ComboBox _UnitComboBox;
public ObserverUnit(ComboBox box)
{
_UnitComboBox = box;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\unit.xml");
_UnitComboBox.DataSource = null;
_UnitComboBox.DisplayMember = "UnitCode";
_UnitComboBox.ValueMember = "UnitCode";
_UnitComboBox.DataSource = dt;//绑定数据源
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
{
private ComboBox _UnitComboBox;
public ObserverUnit(ComboBox box)
{
_UnitComboBox = box;
}
public void Notify()
{
//模模拟从SQL Server取数据
DataTable dt = new DataTable();
dt.ReadXml(Application.StartupPath @"\data\unit.xml");
_UnitComboBox.DataSource = null;
_UnitComboBox.DisplayMember = "UnitCode";
_UnitComboBox.ValueMember = "UnitCode";
_UnitComboBox.DataSource = dt;//绑定数据源
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
/// <summary>
/// 货币资料业务逻辑
///
///
/// </summary>
public class CurrencyData
{
private DataTable _Data; //货币数据,缓存数据
private IList _Observers = new ArrayList();//货币资料的观察者(1...n)
private string _xml = Application.StartupPath @"\data\currency.xml";
public DataTable DataSource { get { return _Data; } }
public void CreateTable()
{
_Data = new DataTable("Currency");
if (File.Exists(_xml))
_Data.ReadXml(_xml);
else
{
_Data.Columns.Add("CurrencyCode", typeof(string));
}
}
public void AddCurrency(string code)
{
_Data.LoadDataRow(new object[] { code }, true);
_Data.AcceptChanges(); //更新缓存的数据
_Data.WriteXml(_xml, XmlWriteMode.WriteSchema);//保存到文件
this.NotifyObservers();//通知所有观察者刷新数据
}
public void DeleteCurrency(string code)
{
DataRow[] rows = _Data.Select("CurrencyCode='" code "'");
if (rows.Length > 0) rows[0].Delete();
_Data.AcceptChanges();//更新缓存的数据
_Data.WriteXml(_xml, XmlWriteMode.WriteSchema); //保存到文件
this.NotifyObservers();//通知所有观察者刷新数据
}
/// <summary>
/// 通知所有观察者
/// </summary>
private void NotifyObservers()
{
foreach (IObserver o in _Observers) o.Notify();
}
/// <summary>
/// 登记观察者
/// </summary>
/// <param name="observers">观察者列表(1..n)</param>
public void RegisterObserver(IList observers)
{
foreach (IObserver o in observers)
{
//if (o is ObserverCurrency) _Observers.Add(o);
_Observers.Add(o);
}
}
}
// 来源:www.CSFramework.com, C/S结构框架学习网
扫一扫加微信
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网