1.观察者模式是什么呢?
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
个人理解:观察者模式是一种思想,不需要人为的去关注观察者和被观察者之间是怎样联系的,实现了解耦,只需要对象去注册被观察者(Observerable)与观察者(Observer),然后被观察者去添加一个或者多个观察者,当被观察者发生变动就会立即通知所有的观察者。
下面我们来列举一个小例子:
比如猫来了,所有的老鼠都会跑,并会说XXX猫来了,快跑,我是XXX老鼠。
第一步:创建一个猫类
public class Cat //通知者 { public string Name{set;get;} //猫的名字 List<Rat> list=new List<Rat>(); //存储老鼠的集合
//增加老鼠的方法
public void Add(Rat rat)
{
list.Add(rat);
}
//删除老鼠的方法
public void Remove(Rat rat)
{
list.Remove(rat);
}
public Cat()
{
}
public Cat(string name)
{
thisName=name;
}
//定义一个猫叫的方法
public void Shout()
{
Console.WriteLine("喵喵喵!!!");
//判断当集合不为空时
if(list!=null)
{
foreach(Rat item in list)
{
itemRun();
}
}
}
}第二步:创建一个老鼠类
public class Rat { public string Name{ set; get;} //老鼠的名字 public Cat MyCat { set; get;}//数据类型是一个猫的变量 public Rat() { } public Rat(string name,Cat cat) { this.Name=name; this.MyCat=cat; } //定义一个老鼠跑的方法 public void Run() { Console.WriteLine(MyCat.Name+"猫来了,快跑!我是"+Name+"鼠"); } }
第三步:创建一个测试类
class Program
{
static void Main(string[] args)
{
//先创建出一只猫
Cat cat=new Cat("Tom");
//创建出第一只老鼠
Rat rat1=new Rat("Jim",cat);
Rat rat2=new Rat("TaoQi",cat);
//把老鼠添加到集合中
cat.Add(rat1);
cat.Add(rat2);
//调用猫叫的方法
cat.Shout();
Console.RadeKey();
}
}
运行结果:
这只是当有一个种类的观察者时,当我们有多个类的时候(比如:鸟,狗等等)我们就需要创建一个接口出来,创建它的实现类。
这个时候就需要我们把有共同行为的提炼到接口内
public interface IRunable //跑
{
void Run();
}
public abstract class Pet
{
public abstract void Shout(); //抽象叫的方法
List<IRunable> list=new List<IRunable>();
public void Add(IRunable irunable)
{
list.Add(irunable);
}
public void Remove(IRunable irunable)
{
list.Remove(irunable);
}
}
public class Cat:Pet
{
public string Name{ set; get;} //猫的名字
public Cat()
{
}
public Cat(string name)
{
this.Name=name;
}
public override void Shout()
{
ConsoleWriteLine("喵喵喵!!!");
if(list!=null)
{
foreach(IRunable item in list)
{
item.Run()
}
}
}
}
public class Rat:IRunable
{
public string Name{ set; get;} //老鼠的名字
public Cat MyCat{ set; get;}
public Rat()
{
}
public Rat(string name,Cat cat)
{
this.Name=name;
this.MyCat=cat;
}
public void Run()
{
Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是老鼠"+Name);
}
}
//创建一个鸟类的观察者
public calss Bird:IRunable
{
public string Name{ set; get;} //鸟的名字
public Cat MyCat{ set; get;}
public Bird()
{
}
public Bird(string name,Cat cat)
{
this.Name=name;
this.MyCat=cat;
}
public void Run()
{
Console.WriteLine(MyCat.Name+"猫来了,快跑!!我是小鸟"+Name);
}
}
class Program
{
static void Main(string[] args)
{
//创建一只猫通知者
Cat cat=new Cat("Tom");
//创建一只老鼠的观察者
Rat rat=new Rat("Jim",cat);
//创建一只小鸟的观察者
Bird bird=new Bird("DiDi",cat);
//把观察者添加到集合中
cat.Add(rat);
cat.Add("bird");
cat.Shout();
Console.RaedKey();
}
运行结果:
观察者模式的特点:
1.一个主题可以有任意数量依赖他的观察者,一旦主题的状态发生改变,所有观察者都可以得到通知
2.主题发出通知不需要知道具体观察者
3.具体观察者也不需要知道其他观察者的存在
但是:
将一个系统分割成一系列相互作用的类有一个很不好的副作用,就是需要维护相关对象间的一致性,
使得各个类紧密耦合,这样会给维护,扩展和重用都带来不便。
应用时机:
当一个对象的改变需要同时改变其他对象的时候使用观察模式 不知道具体有多少对象有待改变时,应考虑使用观察者模式 一个抽象模型有两个方面,其中一个方面依赖于另一个方面