.NET乐园
一个梦想,一个行动…… (欢迎光临我的淘宝http://pipis.taobao.com,专营户外手电筒、头灯、营地灯、自行车灯)

动机:定义对象间的一种一对多依赖关系,以便当一个对象(主体)的状态发生改变时,所有依赖于它的对象(观察者)都得到通知并自动更新。

场景:类似于SharePoint中的“通知我”功能,系统中的列表(包括普通列表、文档列表)发生改变时,可以通过多种途径通知其拥有者。各种列表和通知程序是松耦合的,并不需要互相知晓。


结构

Observer模式结构图



代码
namespace DesignPattern.Observer
{
    
/// <summary>
    
/// 用户
    
/// </summary>

    public class User
    
{
        
private string name;
        
private string email;
        
private string mobile;
        
private string ocsAccount;

        
public string Name
        
{
            
get
            
{
                
return name;
            }

            
set
            
{
                name 
= value;
            }

        }


        
public string Email
        
{
            
get
            
{
                
return email;
            }

            
set
            
{
                email 
= value;
            }

        }


        
public string Mobile
        
{
            
get
            
{
                
return mobile;
            }

            
set
            
{
                mobile 
= value;
            }

        }


        
public string OcsAcccount
        
{
            
get
            
{
                
return ocsAccount;
            }

            
set
            
{
                ocsAccount 
= value;
            }

        }

    }

}

namespace DesignPattern.Observer
{
    
/// <summary>
    
/// 观察者,负责向用户多种通讯设备发送列表更改消息
    
/// </summary>

    public interface ISender
    
{
       
void SendAnnouncement (SenderArgs args);
    }


    
public class EmailSender : ISender
    
{
        
public void SendAnnouncement(SenderArgs args)
        
{
            
// 向地址为args.ToUser.Email的用户发送标题为args.Title,正文为args.Body的Email
        }

    }


    
public class MobileMessageSender : ISender
    
{
        
public void SendAnnouncement(SenderArgs args)
        
{
            
// 向号码为args.ToUser.Mobile的用户发送标题为args.Title,正文为args.Body的短信
        }

    }


    
public class OcsMessageSender : ISender
    
{
        
public void SendAnnouncement(SenderArgs args)
        
{
            
// 向用户名为args.ToUser.OcsAccount的用户发送标题为args.Title,正文为args.Body的OCS信息
        }

    }


    
/// <summary>
    
/// 包含发送消息信息
    
/// </summary>

    public class SenderArgs
    
{
        
private User toUser;
        
private string title;
        
private string body;

        
public User ToUser
        
{
            
get
            
{
                
return toUser;
            }

            
set
            
{
                toUser 
= value;
            }

        }


        
public string Title
        
{
            
get
            
{
                
return title;
            }

            
set
            
{
                title 
= value;
            }

        }


        
public string Body
        
{
            
get
            
{
                
return body;
            }

            
set
            
{
                body 
= value;
            }

        }


        
public SenderArgs(User toUser, string title, string body)
        
{
            
this.toUser = toUser;
            
this.title = title;
            
this.body = body;
        }

    }

}

namespace DesignPattern.Observer
{
    
/// <summary>
    
/// 列表,即主体
    
/// </summary>

    public abstract class List
    
{
        
protected User owner;
        
protected IList<ISender> senders;

        
public User Owner
        
{
            
get
            
{
                
return owner;
            }

            
set
            
{
                owner 
= value;
            }

        }


        
public List(User owner)
        
{
            
this.owner = owner;
            senders 
= new List<ISender>();
        }


        
public void Notify(SenderArgs args)
        
{
            
foreach (ISender sender in senders)
            
{
                sender.SendAnnouncement(args);
            }

        }


        
public void AddSender(ISender sender)
        
{
            senders.Add(sender);
        }


        
public void RemoveReceiver(ISender sender)
        
{
            senders.Remove(sender);
        }

    }


    
public interface IList
    
{
        
void Add(ListItem item);
        
void Update(ListItem item);
        
void Delete(ListItem item);
    }


    
/// <summary>
    
/// 列表数据项
    
/// </summary>

    public class ListItem
    
{
        
private string title;

        
public string Title
        
{
            
get
            
{
                
return title;
            }

            
set
            
{
                title 
= value;
            }

        }

    }


    
public class GenericList : List, IList
    
{
        
public GenericList(User owner)
            : 
base(owner)
        
{
        }


        
public void Add(ListItem item)
        
{
            
// 添加数据项
            SenderArgs args = new SenderArgs(owner, "添加了标题为" + item.Title + "的列表数据项""详情……");
            Notify(args);
        }


        
public void Update(ListItem item)
        
{
            
// 更新数据项
            SenderArgs args = new SenderArgs(owner, "更新了标题为" + item.Title + "的列表数据项""详情……");
            Notify(args);
        }


        
public void Delete(ListItem item)
        
{
            
// 删除数据项
            SenderArgs args = new SenderArgs(owner, "删除了标题为" + item.Title + "的列表数据项""详情……");
            Notify(args);
        }

    }


    
public class DocumentList : List, IList
    
{
        
public DocumentList(User owner)
            : 
base(owner)
        
{
        }


        
public void Add(ListItem item)
        
{
            
// 添加文档
            SenderArgs args = new SenderArgs(owner, "添加了名称为" + item.Title + "的文档""详情……");
            Notify(args);
        }


        
public void Update(ListItem item)
        
{
            
// 更新文档
            SenderArgs args = new SenderArgs(owner, "更新了标题为" + item.Title + "的文档""详情……");
            Notify(args);
        }


        
public void Delete(ListItem item)
        
{
            
// 删除文档
            SenderArgs args = new SenderArgs(owner, "删除了标题为" + item.Title + "的文档""详情……");
            Notify(args);
        }

    }

}


posted on 2007-08-07 23:37  Charly  阅读(592)  评论(0编辑  收藏  举报