学习程序已经有一段时间了,发现我面向过程的思维还在。拿到一个项目我先想到的就是如何去实现功能,而不是先把各个系统分成很多个子系统来理解。具体的逻辑关系可以先不要考虑,面向对象的程序会更好的理解代码和今后的使用,这也是我要把设计模式啃下来的原因。面向对象是一个封装隔离的思想,抽象大于具体。
今天对观察者模式的学习有了一点感觉,特此记录下来:
观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。也就是说观察者可以通过订阅被观察者的状态来决定是否做出反应。之前对于这个模式的误区在于,我总想着被观察者发生改变后自然的就去调用观察者,这是极其错误的方式,一旦观察者发生变化,有观察者退出或者加入新的观察者就要去修改被观察者的代码,违反了开闭原则。
举例说明:猫和老鼠,现在猫是被观察者,老鼠是观察者。假设猫进房间老鼠做出反应,目前我想到的操作是创建一个猫类和一个老鼠类,当猫进入房间就调用老鼠类里的逃跑方法。这样做逻辑上没有问题也能很好地实现功能,但是如果增加了老鼠的话,又要修改猫进房间的方法,违反了开闭原则,代码的复用性不高,所以比较好的方法是采用观察者模式,使用委托的方法来实现功能。
代码实例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 观察者模式学习
{
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("小赖","白色");
Mouse mouse1 = new Mouse("小严", "红色");
Mouse mouse2 = new Mouse("小毛", "蓝色");
//把mouse1的ran方法注册进委托
cat.CatCome += mouse1.Run;
//把mouse2的ran方法注册进委托
cat.CatCome += mouse2.Run;
cat.CatComing();
Console.ReadLine();
}
}
/// <summary>
/// 创建一个猫类(被观察者)
/// </summary>
class Cat
{
//属性:猫的名字
private string Name;
//属性:猫的颜色
private string Color;
/// <summary>
/// 构造方法用来给Name和Color赋值
/// </summary>
/// <param name="name"></param>
/// <param name="color"></param>
public Cat(string name,string color)
{
this.Name = name;
this.Color = color;
}
/// <summary>
/// 猫进屋的方法(被观察者状态发生改变)
/// </summary>
public void CatComing()
{
Console.WriteLine(Color + "的猫" + Name + "进来了");
if(CatCome !=null)
CatCome();
}
/// <summary>
/// 声明一个委托
/// </summary>
public Action CatCome;
}
/// <summary>
/// 创建一个老鼠类(观察者)
/// </summary>
class Mouse
{
//属性:老鼠的名字
private string Name;
//属性:老鼠的颜色
private string Color;
/// <summary>
/// 构造方法用来给Name和Color赋值
/// </summary>
/// <param name="name"></param>
/// <param name="color"></param>
public Mouse(string name,string color)
{
this.Name = name;
this.Color = color;
}
/// <summary>
/// 老鼠的逃跑方法
/// </summary>
public void Run()
{
Console.WriteLine(Color + "的老鼠" + Name + "说:猫来了,快跑");
}
}
}
由于对类的实例化,构造赋值,委托声明,属性都不太熟,所以加了很多注释方便以后查阅。对观察者模式的了解就是这样具体在游戏中怎么使用等用过之后再来更新。