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

2014-11-24 02:43:04 · 作者: · 浏览: 10
2
{
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);
}
}
}


14. 模板方法模式

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。将不变的行为搬到超类中,去除子类中的重复代码来体现他的优势,提供了一个很好的代码复用平台(举个例子:学生考试有考试卷作为模板,之后通过不同的学生添加不同的答案得到不同的分数形成具体的类)


UML图:

\


代码:

view plaincopy to clipboardprint //10.3 把容易改变的设置为虚方法

namespace 模板方法模式
{
class Class2
{
static void Main(string[] args)
{
TestPaper2 studentA = new TestPaperA2();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQues