抽象类和接口与设计原则的关系

什么是抽象类?

官方:
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

就是比如我们熟悉的泰迪,哈巴,二哈,阿拉斯加,秋田犬等等大小形态有很大区别,我们怎么把他们抽象一下呢?那就是他们都有一些本质上相同的东西那就是他们都是狗,是狗就有耳朵,尾巴,四肢等等我们把这些给抽象出来,至于耳朵是啥样的,尾巴是长是短,颜色是啥,这就需要子类实现狗这个抽象方法了。

这就是我们之前面向对象的一个基本特性,抽象。

那这个抽象类的作用是什么呢?
1、用于隐藏
对类型进行隐藏,我们可以构造出一个固定的一组行为的抽象描述,一个行为可以有任意个可能的具体实现方式。这个抽象的描述就是抽象类。(参考多态)

2、用于拓展对象的行为功能
这一组任意个可能的具体实现表现为所有可能的子类,模块可以操作一个抽象类,由于模块依赖于一个固定的抽象类,那么他是不允许修改的。同时通过这个抽象类进行派生,拓展此模块的行为功能。(参考开放闭合原则:程序对修改关闭(对于使用方来说),对扩展开放(对于提供方来说),下图增加绘制三角形的时候修改了使用方

 而改成下面这种方法则遵循了开闭原则:


接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。

接口是一种特殊的abstract class,但是比abstract class更加抽象,

那么接口的作用是什么呢?
1、Java单继承的原因所以需要曲线救国 作为继承关系的一个补充。
2、把程序模块进行固化的契约,降低偶合。把若干功能拆分出来,按照契约来进行实现和依赖。(依赖倒置原则:1.高层逻辑模块不应该依赖低层细节模块,两者都应该依赖其抽象 2.抽象不应该依赖细节,细节应该依赖抽象面向对象六大原则——依赖倒置原则_皮皮的雅客-CSDN博客_依赖倒转原则什么是依赖倒置原则(Dependence Inversion Principle, DIP) 依赖倒置原则的包含如下的三层含义: - 高层模块不应该依赖低层模块,两者都应该依赖其抽象 - 抽象不应该依赖细节 - 细节应该依赖抽象 每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块(一般是接口,抽象类),原子逻辑的组装就是高层模块。在Java语言中,抽象就是指...https://blog.csdn.net/king123456man/article/details/81626127


3、定义接口有利于代码的规范。(接口分离原则:当客户类被强迫依赖那些它们不需要的接口时,则这些客户类不得不受制于这些接口。这无意间就导致了所有客户类之间的耦合。换句话说,如果一个客户类依赖了一个类,这个类包含了客户类不需要的接口,但这些接口是其他客户类所需要的,那么当其他客户类要求修改这个类时,这个修改也将影响这个客户类。通常我们都是在尽可能的避免这种耦合,所以我们需要竭尽全力地分离这些接口。六大设计原则之接口分离原则(Interface Segregation Principle) - 简书


 

一个抽象类和接口的使用具体对比

abstract class MotorVehicles {
   abstract void brake();
}
interface MoneyFare {
   void  charge();
}
interface ControlTemperature {
   void controlAirTemperature();
}
class Bus extends MotorVehicles implements MoneyFare {
    void brake() {
        System.out.println("公共汽车使用毂式刹车技术");
    }
    public  void charge() {
        System.out.println("公共汽车:一元/张,不计算公里数");
    }
} 
class Taxi extends MotorVehicles implements MoneyFare,ControlTemperature {
    void brake() {
        System.out.println("出租车使用盘式刹车技术");
    }
    public  void charge() {
        System.out.println("出租车:2元/公里,起价3公里");
    }
    public void  controlAirTemperature() { 
        System.out.println("出租车安装了Hair空调");
    }

}
class Cinema implements MoneyFare,ControlTemperature {
    public  void charge() {
        System.out.println("电影院:门票,十元/张");
    }
    public void  controlAirTemperature() { 
       System.out.println("电影院安装了中央空调");
    }
}
public class Example6_2 {
   public static void main(String args[]) {
       Bus  bus101 = new Bus();
       Taxi buleTaxi = new Taxi();
       Cinema redStarCinema = new Cinema();
       bus101.brake(); 
       bus101.charge();
       buleTaxi.brake();
       buleTaxi.charge();
       buleTaxi.controlAirTemperature();
       redStarCinema.charge();
       redStarCinema.controlAirTemperature();
   }
}

大部分内容来源于接口(Interface)与抽象类(Abstract Class)的区别? - 简书

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值