设计模式之行为型模式一(一)

2014-11-24 11:07:23 · 作者: · 浏览: 3
行为型模式:
观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.
观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了变化,所有的Observer都可以得到通知。
Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。
应用:
1,当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时。
2,一个抽象模型有两个方面,其中一方面依赖于另一方面。观察者模式所做的工作就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
课本实例:前台帮同事观察老板的情况
代码如下:
[csharp]
//通知者接口
//一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和删除观察者对象
interface subject
{
void attach(Observer observer);
void detch(Observer observer);
void notify();
string subjectstate
{
get;
set;
}
}
//将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
class boss : subject
{
//同事列表
private IList observers=new List ();
private string action;
//增加
public void attach(Observer observer)
{
observers.Add(observer);
}
//减少
public void detach(Observer observer)
{
observers.Remove(observer);
}
//通知
public void Notify()
{
foreach (Observer o in observers)
o.update();
}
//老板状态
public string subjectstate
{
get {return action;}
set {action=value;}
}
}
//抽象观察者
//为所有观察者定义一个接口,在得到主题通知时更新自己.
abstract class Observer
{
protected string name;
protected subject sub;
public Observer(string name, subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void update();
}
//看股票的同事
//实现抽象观察者角色所要求的更新接口
class stockobserver : Observer
{
public stockobserver(string name, subject sub)
: base(name, sub)
{ }
public override void update()
{
Console.WriteLine("{0}{1}关闭股票行情,继续工作", sub.subjectstate, name);
}
}
个人理解观察者模式不足:
对于已经封装好的类来说,即使他们对某一变化产生动作,但产生这一动作的方法名称也不一定一样,如果我用观察者模式的话,当我定义抽象观察者时,是很麻烦的,需要改动已经封装好的类的名称等内容。
处理不足的措施:
委托- 一个委托可以搭载多个方法,所有方法被依次唤起,重要的是它可以使得委托对象所搭载的方法并不需要属于同一个类。委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
实现:去掉了父类“抽象观察类”并将“更新”方法名改为各自适合的方法名
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
代码如下:
[csharp]
class testpaper
{
public void TestQuestion1()
{
Console.WriteLine("杨过得到,后来给了郭靖,练成倚天剑,屠龙刀的玄铁可能是()a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维");
Console.WriteLine("答案:" + answer1());
}
protected virtual string answer1()
{
return " ";
}
}
//学生甲抄的试卷
class testpaperA : testpaper
{