会员
周边
众包
新闻
博问
闪存
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
愚蠢的笨蛋
博客园
首页
新随笔
联系
管理
订阅
Observer观察者模式
银行帐户改变的时候需要通过短信,邮件等方式通知客户,编写代码实现:
传统的做法:
传统做法
public
class
ATM
{
BankAccount bankAccount;
void
process()
{
bankAccount.Withdraw(data);
}
}
public
class
BankAccount
{
Emailer emailer;
//
强依赖关系
Mobile mobile;
//
强依赖关系
public
void
Withdraw(
int
data)
{
//
emailer.SendEmail(userEmail);
mobile.SendNotification(phonenumber);
}
}
public
class
Emailer
{
public
void
SendEmail(
string
to)
{
//
..
}
}
public
class
Mobile
{
public
void
SendNotification(
string
to)
{
//
..
}
}
Observer模式:
Observer
using
System.Collections;
public
abstract
class
Subject
{
ArrayList
<
IAccountObserver
>
observerList
=
new
ArrayList
<
IAccountObserver
>
();
protected
virtual
void
Notifi(UserAccountArgs args)
{
foreach
(IAccountObserver observer
in
observerList)
{
observer.Update(args);
}
}
public
void
AddObserver(IAccountObserver observer)
{
observerList.Add(observer);
}
public
void
RemoveObserver(IAccountObserver observer)
{
observerList.Remove(observer);
}
}
public
interface
IAccountObserver
{
void
Update(UserAccountArgs args);
}
public
class
BankAccount : Subject
{
public
void
Withdraw(
int
data)
{
//
UserAccountArgs args
=
new
UserAccountArgs();
//
Notifi(args);
}
}
public
class
Emailer : IAccountObserver
{
public
void
Update(UserAccountArgs args)
{
//
.
string
toAddress
=
args.ToAddress;
}
}
public
class
Mobile : IAccountObserver
{
public
void
Update(UserAccountArgs args)
{
string
mobileNumber
=
args.MoblieNumber;
}
}
class
App
{
public
static
void
Main()
{
Subject subject
=
new
BankAccount();
IAccountObserver observer
=
new
Emailer();
subject.AddObserver(observer);
subject.Withdraw(
234
);
}
}
更牛*的使用委托:
delegate
public
delegate
void
AccountChangeEventHandler(
object
sender,
AccountChangeEventArgs args);
//
接口,约定
public
class
BankAccount
{
public
event
AccountChangeEventHandler AccountChange;
public
void
Withdraw(
int
data)
{
//
UserAccountArgs args
=
new
UserAccountArgs();
//
Notifi(args);
}
protected
virtual
void
OnAccountChange()
{
if
(AccountChange
!=
null
)
{
AccountChange(args);
}
}
}
public
class
Emailer
{
public
void
Update(
object
sender, UserAccountArgs args)
{
//
.
string
toAddress
=
args.ToAddress;
}
}
class
App
{
public
static
void
Main()
{
BankAccount bankAccount
=
new
BankAccount();
Emailer emailer
=
new
Emailer();
bankAccount.AccountChange
+=
new
AccountChangeEventHandler(emailer.Update);
bankAccount.Withdraw(
234
);
}
}
posted @
2009-05-21 11:38
愚蠢的笨蛋
阅读(
117
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告