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

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

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

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

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

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值