您的位置:首页 > 编程语言 > C#

C# 通过 Observer观察者 设计模式 来理解 抽象类 和 接口 应用在什么地方

2013-06-18 10:53 1246 查看
什么时候用抽象类?什么时候用接口?怎么理解抽象类?怎么理解接口?

一、百度解释抽象类和接口的区别

总而言之就是一句话:抽象类可以包含具体实现,接口只能包含定义。

实现接口时必须实现接口定义的方法等,抽象类中如果给方法加上了“abstract”,那么这个方法也需要在继承后实现这个方法,从这里来看,接口是不包含具体实现的特殊抽象类。

二、观察者模式体会接口和抽象类的区别

观察者模式是什么? 我来举个例子,你家里有4口人,有一个婴儿、爸爸、妈妈、奶奶,现在模拟一个场景: baby在睡觉,baby一旦醒了之后就会哭,如果baby哭了之后爸爸、妈妈、奶奶都会做一些事情(具体做什么事等会看代码),那么baby什么时候醒呢?不知道,这种情况下,爸爸、妈妈、奶奶就得不停的去看baby醒了没,干不了其他事情,这样很不合理,于是我们就应该变成baby醒了这个事件触发爸爸、妈妈、奶奶的响应事件。 请看如下代码:
using System;
using System.Collections;

//观察者, 定义为接口
public interface Observer
{
void Do();
}

//爸爸, 实现观察者接口后变为一个观察者
public class Father : Observer
{

public void Do()
{
//爸爸告诉妈妈,baby醒了
Console.WriteLine("Father tell baby's mother the baby is weak up.");
}
}

//妈妈, 实现观察者接口后变为一个观察者
public class Mother : Observer
{
public void Do()
{
//妈妈要来抱baby
Console.WriteLine("Mother embrace the baby.");
}
}

//奶奶, 实现观察者接口后变为一个观察者
public class GrandMother : Observer
{
public void Do()
{
//奶奶要去拿牛奶
Console.WriteLine("Grandmother take the milk to baby.");
}
}

//被观察对象, 定义为抽象类
public abstract class Subject
{
public ArrayList list = new ArrayList();
public void Attach(params Observer[] dst)
{
for (int i = 0; i < dst.Length; i++)
{
list.Add(dst[i]);
}
}
public void DeTach(params Observer[] dst)
{
for (int i = 0; i < dst.Length; i++)
{
list.Remove(dst[i]);
}
}
public abstract void WeakUpAndCry();
}

//宝宝, 继承被观察者抽象类后成为被观察者
public class Baby:Subject
{
public Baby(string name)
{
this.Name = name;
}
private string Name { get; set; }

public override void WeakUpAndCry()
{
foreach (Observer item in list)
item.Do();
}
}

//程序入口
public class Client
{
public static void Main(string[] args)
{
Baby baby = new Baby("simon");
baby.Attach(new Father(), new Mother(),new GrandMother());
baby.WeakUpAndCry();
Console.Read();
}
}


问题1:Subject抽象类定义了一个抽象方法“public abstract void WeakUpAndCry();”,这个方法必须在子类重写,为什么我们不把这个方法也实现在抽象类中,这样就不用抽象类了,直接使用普通的class就好了?
假如我的业务要求:如果baby叫simon,爸爸、妈妈、奶奶都要做出响应,如果baby叫lucy,爸爸不做任何操作。这种需求如果把WeakUpAndCry方法实现在抽象类中,就没办法做到了。
从上面的代码可以发现:1. 观察者是接口 2.被观察者是抽象类
那么我们就能得出结论:

1.接口是用来定义实现类长什么样子
2.抽象类就是提供一组公用的方法,对于非公用部分它会定义好,但不实现它,可以根据你自己的需求在各个子类中写出不同的实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: