小故事学设计模式之Observer : (三) 老婆帮忙订机票
(IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便还能跟同行们交流一下)
要和老婆一起回老家了, 成都离我们安徽太远, 两个人飞一下过去就要花掉近三千块, 于是我们决定找找有没有更便宜的机票,
"你帮我找找吧, 如果找到的话,跟我说一下",我说道.
"行!"老婆记住了这事.
很快我得到通知, 南航有更便宜的, 580块.
这是一个简单的observer模式.
什么是observer? 其定义如下:
The Observer Patern defines a one-to-many dependency betwen objects so that when one object changes state, all its dependents are notified and updated automatically.
大概结构来描述就如下:

其中Neo(就是我以前在IT混日子的马甲拉)是继承于TicketBuyer这个抽象类的, 为什么这里要加一个抽象类,因为老婆表兄妹多, 都有可能找她订票, 所以要把这些表兄妹的行为抽象到一个公共的抽象类上.
using System;
using System.Collections.Generic; public abstract class TicketBuyer
{
public int TicketPrice;
public string Airline;
} public class Neo: TicketBuyer
{
private int _ticketPrice;
private string _airline; public int TicketPrice
{
get {return _ticketPrice;}
set {_ticketPrice = value;}
} public string Airline
{
get{return _airline;}
set{_airline = value;}
}
}
public class FeiFei
{
private string _airline;
private int _ticketPrice; IList<TicketBuyer> _ticketBuyers; public FeiFei()
{
_ticketBuyers = new List<TicketBuyer>();
} public void AddTicketBuyer(TicketBuyer t)
{
_ticketBuyers.Add(t);
} public void DeleteTicketBuyer(TicketBuyer t)
{
_ticketBuyers.Remove(t);
} public void NotifyTicketInformation()
{
SearchTicket();
foreach(TicketBuyer t in _ticketBuyers)
{
t.Airline = _airline;
t.TicketPrice = _ticketPrice;
}
} private void SearchTicket()
{
_airline = "China Southern";
_ticketPrice = 580;
}
}
运行代码看一下结果:
public class Test
{
public static void Main()
{
TicketBuyer n = new Neo();
FeiFei f = new FeiFei();
f.AddTicketBuyer(n);
f.NotifyTicketInformation();
Console.WriteLine("Airline:" + n.Airline + ", price:" + n.TicketPrice);
Console.Read();
}
}

好了,以上是个人对Observer模式的理解,如有不正确的地方,希望同行能帮我纠正。
谢谢大家!
小故事学设计模式之Observer : (三) 老婆帮忙订机票的更多相关文章
- 小故事学设计模式之Decorate: (二)老婆的新衣服
老婆有一件蓝色的裙子和一件粉色的裙子, 不管怎么穿,她还是原来的老婆. 但是在软件里就不一定了, 如果把老婆比作一个class的话, 有一种做法是会因为增加了两个新的Property而继承出两个子类: ...
- 小故事学设计模式之Command : (一) 在永和豆浆店
IT的事就是过场多,过场多了就容易忘,所以我们不妨看一个记一个,这也是一个办法,顺便跟同行们学习交流一下)前几天出去拍照,饿到腿软, 回城附近有一家永和豆浆店, 我们决定去那边解决午餐.豆浆店里面还不 ...
- 小故事理解TCP/IP连接时的三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接,示意图如下: 下面通过一个小故事简单理解一下这三次握手的具体含义: 一天,快递员小客(客户端)准备去小服(服务器)家去送快递(准备与服务 ...
- 生活沉思录 via 哲理小故事
本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- 从壹开始 [ Design Pattern ] 之三 ║ 工厂模式 与 小故事
编者按: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到子类. 工厂模式,是迄今为止,使用最多,最广泛的设计模式之一,它的身影几乎出现在每一个框架和个人代码之中 ...
- UESTC_小panpan学图论 2015 UESTC Training for Graph Theory<Problem J>
J - 小panpan学图论 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) S ...
- .net基础学java系列(三)徘徊反思
.net基础学java系列(三)徘徊反思 上一篇文章:.net基础学java系列(二)IDE 之 插件 这两天晚上看完了IDEA的教学视频:https://edu.51cto.com/course/1 ...
- 从零开始单排学设计模式「装饰模式」黑铁 I
阅读本文大概需要 3.6 分钟. 本篇是设计模式系列的第四篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统. 所以现在打算重写,加上距离现在也有一段时间了 ...
随机推荐
- 处女座和他的小姐姐(三)----数位DP
链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! 处女座其实 ...
- drf之视图案例
views.py from django.shortcuts import render # Create your views here. from rest_framework.generics ...
- 【实战】Oracle注入总结
小结: Union联合查询: order by 定字段 and 1=2 union select null,null..... from dual 然后一个一个去判断字段类型,方法如下 and 1=2 ...
- Python学习 day06
一.== 和 is == 比较的是值 is 比较的是地址 id() -- 返回对象的内存地址 例: 赋值操作是将地址赋给变量 Python 中会实现创建一个小型的整形池,范围为 [-5,25 ...
- 【Tensorflow】 Object_detection之liunx服务器安装部署步骤记录
环境:centos7+anaconda python3.6 步骤: 1.下载Models cd 到预存放目录下,执行: git clone https://github.com/tensorflow/ ...
- hibernate框架配置文件详解
1 orm元数据配置文件(映射文件) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hib ...
- JAVA 利用反射自定义数据层框架
之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...
- 吴恩达《Machine Learning Yearning》总结(11-20章)
11.何时修改开发集.测试集和度量指标 开展一个新项目,尽快选好开发集和测试集:例子,根据度量指标A分类器排在B分类器前面,但是团队认为B分类器在实际产品上优于A分类器,这时就需要考虑修改开发集和测试 ...
- php 项目中自定义日志方法
在现在项目中之前没有定义日志的方法,每次调试起来很麻烦,经常不能输出参数,只能用写日志的方法,一直用file_put_contents很烦躁,于是用了一点时间,写了这样一个方法: <?php / ...
- SVN服务器在Ubuntu16.04下搭建多版本库详细教程
1 介绍 Subversion是一个自由,开源的版本控制系统,这个版本库就像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况.这样就可 以很方面恢复到以前的版本,并可以查看数据 ...