惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
J
Java Code Geeks
The GitHub Blog
The GitHub Blog
博客园_首页
U
Unit 42
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
IT之家
IT之家
G
Google Developers Blog
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
Jina AI
Jina AI
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
小众软件
小众软件
H
Help Net Security

博客园 - Charly

我的电影记录 再去听他的演唱会 学友12月29日广州演唱会 张学友十大粤语&十大国语金曲赏析 妈妈的第二次重生 随便谈谈最近参与的2个项目 中奖的幸运与不幸 设计模式学习笔记二十五——总结 Moss2007搜索服务配置,没有索引器和搜索配置页面报错问题解决 设计模式学习笔记二十四——Visitor模式 设计模式学习笔记二十三——TemplateMethod模式 设计模式学习笔记二十二——Strategy模式 设计模式学习笔记二十一——State模式 设计模式学习笔记二十——Memento模式 在MOSS 2007中调试WebPart 设计模式学习笔记十八——Mediator模式 设计模式学习笔记十七——Iterator模式 设计模式学习笔记十六——Interpreter模式 设计模式学习笔记十五——Command模式
设计模式学习笔记十九——Observer模式
Charly · 2007-08-07 · via 博客园 - Charly

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

场景:类似于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);
        }

    }

}