当前位置: 首页 > news >正文

设计模式-观察者模式

观察模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新;

以下的列子含义:当车站要求指定的列车发车,所有在站内的列表均得到发车通知!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
 
namespace  PatternProject
{
     public  interface  ITrain
     {
         string  From
         get set ; }
 
         string  To
         get set ; }
 
         DateTime StartingDateTime
         get set ; }
 
         void  Start(ITrain train);
     }
 
     public  interface  IStation
     {
         void  AddTrain(ITrain train);
         void  CancelTrain(ITrain train);
         void  StartNotify(ITrain train);
     }
 
     public  class  Station : IStation
     {
         List<ITrain> _trainList =  new  List<ITrain>();
 
         public  void  AddTrain(ITrain train)
         {
             _trainList.Add(train);
         }
 
         public  void  CancelTrain(ITrain train)
         {
             _trainList.Remove(train);
         }
 
         public  void  StartNotify(ITrain train)
         {
             foreach  (ITrain t  in  _trainList)
             {
                 t.Start(train);
             }
         }
     }
 
     public  class  Train : ITrain
     {
        public  string  From
         get set ; }
 
        public  string  To
         get set ; }
 
        public  DateTime StartingDateTime
         get set ; }
 
        public  Train( string  from string  to, DateTime startingDateTime)
        {
            this .From =  from ;
            this .To = to;
            this .StartingDateTime = startingDateTime;
        }
 
        public  bool  IsCurrent(ITrain train)
        {
            if  (train.From ==  this .From && train.To ==  this .To && train.StartingDateTime ==  this .StartingDateTime)
            {
                return  true ;
            }
            else
            {
                return  false ;
            }
        }
 
        public  void  Start(ITrain train)
        {
            Console.WriteLine( "{0}开往{1}列车收到通知:" , this .From, this .To);
            if  (IsCurrent(train))
            {
                Console.WriteLine( "从{0}开往{1}的列车,于{2}开车,敬请注意!" this .From,  this .To,  this .StartingDateTime);
            }
            else
            {
                Console.WriteLine( "还未到开车时间,敬请稍候!" );
            }
        }
     }
 
 
}<br><br>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
 
namespace  PatternProject
{
     class  Program
     {
         static  void  Main( string [] args)
         {
 
             Station station =  new  Station();
             
             station.AddTrain( new  Train( "北京" "上海" new  DateTime(2014, 5, 1)));
             station.AddTrain( new  Train( "北京" "武汉" new  DateTime(2014, 3, 1)));
             station.AddTrain( new  Train( "武汉" "上海" new  DateTime(2014, 2, 1)));
             station.AddTrain( new  Train( "上海" "南京" new  DateTime(2014, 8, 1)));
 
             Train t =  new  Train( "北京" "武汉" new  DateTime(2014, 3, 1));
 
             station.StartNotify(t);
 
             Console.ReadKey();
         }
     }
}

  本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/3504852.html ,如需转载请自行联系原作者

相关文章:

  • 检测您的CPU是否支持RemoteFX(SLAT二级地址转换)
  • 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验...
  • windows中禁止U盘写入
  • 使用LVS+NAT搭建集群实现负载均衡
  • AWS CLI使用s3
  • Java源码分析系列之ArrayList读后感
  • shell特殊符号,cut、sort、wc、uniq、tee、tr、split命令
  • jmeter源码编译
  • 详解CSS display:inline-block的应用
  • Keras查看model weights .h5 文件的内容
  • 在WinForm中增加查询对话框对DataGridView数据进行循环查找
  • Ubuntu系统主题及插件工具等官方地址
  • 关于登录随机验证码的实现
  • Ubuntu 2TB sdb preseed示例
  • python 基础 9.2 mysql 事务
  • 《深入 React 技术栈》
  • 11111111
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular数据绑定机制
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mysql数据库的条件查询语句
  • Python语法速览与机器学习开发环境搭建
  • Redis字符串类型内部编码剖析
  • spring boot 整合mybatis 无法输出sql的问题
  • SSH 免密登录
  • storm drpc实例
  • 动态魔术使用DBMS_SQL
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 使用parted解决大于2T的磁盘分区
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 阿里云服务器如何修改远程端口?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)ABI是什么
  • .NET下的多线程编程—1-线程机制概述
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @NestedConfigurationProperty 注解用法
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [codeforces]Levko and Permutation
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [C语言]——柔性数组
  • [IE编程] 如何获得IE版本号
  • [Java]快速入门二叉树,手撕相关面试题
  • [LeetCode][138]【学习日记】深拷贝带有随机指针的链表
  • [Notice] 朋友们,blog更新http://jiang-hongfei.spaces.live.com
  • [RISC-V]verilog
  • [Winodows Phone 7控件详解]Map-2
  • [Winodows Phone 7控件详解]Silverlight toolkit for Windows Phone 7.1控件-3
  • [抽象]工厂模式([Abstract] Factory)——创建型模式