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

来源:互联网 发布:大宝眼霜怎么样 知乎 编辑:程序博客网 时间:2024/04/29 06:08

什么时候用抽象类?什么时候用接口?怎么理解抽象类?怎么理解接口?

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

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

实现接口时必须实现接口定义的方法等,抽象类中如果给方法加上了“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.抽象类就是提供一组公用的方法,对于非公用部分它会定义好,但不实现它,可以根据你自己的需求在各个子类中写出不同的实现

 

 

 


 

原创粉丝点击