设计模式(4)一――行为型模式(一)

2014-11-24 02:43:04 · 作者: · 浏览: 8

本篇博客我们说的是行为型模式,其中包括以下一种模式:观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。

13.管擦者模式

定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有观察者,使他们能够自动更新自己。委托是一种很好的观察者模式。(举个例子:在Adidas厂商生产出来了一款新的衣服,所有的连锁店(观察者)都会得到通知)


UML图:

\


代码:

view plaincopy to clipboardprint namespace 观察者模式
{
class Class2
{
static void Main(string[] args)
{
Boss huhansan = new Boss();

StockObserver2 tongshi1 = new StockObserver2("为贯彻",huhansan );
NBAObserver2 tongshi2 = new NBAObserver2("以观察",huhansan );

huhansan.Attach(tongshi1 );
huhansan.Attach(tongshi2);
huhansan.Detach(tongshi1 );

huhansan.SubjectState = "老板我回来了";
huhansan.Notify();
}
}
interface Subject //通知者接口
{
void Attach(Observer2 observer);
void Detach(Observer2 observer);
void Notify();
string SubjectState
{
get;
set;
}
}
class Boss : Subject //老板类
{
private IList observers = new List();
private string action;


public void Attach(Observer2 observer)
{
observers.Add(observer );
}

public void Detach(Observer2 observer)
{
observers.Remove(observer);
}

public void Notify()
{
foreach (Observer2 o in observers)
o.Update();
}

public string SubjectState
{
get
{
return action;
}
set
{
action = value;
}
}
}
class Secretary2 : Subject //老板类
{
private IList observers = new List();
private string action;


public void Attach(Observer2 observer)
{
observers.Add(observer);
}

public void Detach(Observer2 observer)
{
observers.Remove(observer);
}

public void Notify()
{
foreach (Observer2 o in observers)
o.Update();
}

public string SubjectState
{
get
{
return action;
}
set
{
action = value;
}
}
}

abstract class Observer2 //抽象观察者
{
protected string name;
protected Subject sub;

public Observer2(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
class StockObserver2 : Observer2
{
public StockObserver2(string name, Subject sub)
: base(name, sub)
{ }


public override void Update()
{
Console.WriteLine("{0}{1}关闭股票行情,继续工作!",sub.SubjectState ,name );
}
}
class NBAObserver2 : Observer2
{
public NBAObserver2(string name, Subject sub)
: base(name, sub)
{ }


public override void Update()
{
Console.WriteLine("{0}{1}关闭NBA直播,继续工作!", sub.SubjectState, name);
}
}
}
namespace 观察者模式
{
class Class