设计模式 - 单例、观察者(1)

本文介绍了单例模式和观察者模式的实现方法及其应用场景。单例模式确保一个类只有一个实例,并提供全局访问点;观察者模式定义了一种一对多的依赖关系,使得多个对象能同时监听一个主题对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

1. 单例模式(Singleton)

   故事:最近我在使用一个赚取积分的软件,只要用申请的帐号登录后,就可以获得积分,足够的积分就可以在网上直接兑换成小玩具,巧克力和糖果。于是我申请了很多帐号,并让它们同时登录,我想这是个不错的主意,因为多个帐号同时登录就可同时赚取积分获得更多的糖果了,哈哈哈。。。。直到有一天。。。。。。。。。

   思路:由于一个类只能有一个实例,所以不能直接用构造函数来生成实例。我们想到的是向外提供一个公有方法,在该方法中判断实例的存在,决定是否生成实例。怎么访问这个方法呢?让我想想。。。。嗯。。。我们不是可以把它声明为static方法吗,这样就可以直接通过类来访问了。

   方法:(1) 要使构造函数不被用来生成实例,必须将它的public访问控制改成private或者protected。

            (2) 公有方法的作用:判断是否存在一个实例,如果存在则返回该实例,否则创建一个实例。因些它返回类的实例。由于被调用前没有形成实例,必须把该方法声明为static类型的,通过类名来调用。

            (3) 类中必须有一个保存该实例的类变量。同理声明为static类型,使它和实例脱勾。

   实例列举:你可以打开多个记事本,但不管你按多少次的Ctrl+Alt+Del,你也只能打开一个windows任务管理器 

输出:

The same window!

 

注意:以上实例只用于单线程环境。对于多线程环境,必须加锁处理或信号量处理。

 

2. 观察者模式(Observer)

   现实生活中的例子:多个用户订阅了小李在Youtube上的视频,当有新的视频上传,系统自动发邮件通知各个订阅者。

   思路:该模式讲述的是一种多对一的依赖关系,当一件事物发生变化,依赖于该事物的其它所有事物应该作出反应。主题发生变化,则通知相关的订阅者。这样,主题必须维护一群订阅者,在主题类中用ArrayList来存储。通知这个动作针对的是每一个订阅者,用foreach可以办到,且该动作是因主题变化而触发的。订阅者除了对主题的变化表示响应外完全可以不做其它事情。

   例子实现: 

 

输出:

subscriber1收到视频更新消息!
subscriber2收到视频更新消息!
subscriber3收到视频更新消息!
subscriber1收到视频更新消息!
subscriber2收到视频更新消息!

      当我们掌握了该模式中的角色和要素,换换类名和方法名,改写一下方法中的内容,就能轻而易举地模仿生活中的观察者模式。如:班上要搞活动,班长将通知班上的各个同学作些准备;将我的宝马开到A宾馆,负责看车的工作人员说,一有情况就通知你。每个房间都装上了烟雾传感器,意外情况时,控制中心的警报器发出警报。

 

以上转载:http://www.cnblogs.com/JCSU/articles/1294671.html

 

再加上我最近的一点的理解,看了观察者模式,想起了猫,老鼠,主人的联动反应这个例子,其中有一种思路就是观察者模式:

程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

要求: 
1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声可能引起其他联动效应。

 

要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象
评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分) 
                 <2>从Mouse和Master中提取抽象(5分)
                 <3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值