面向接口编程与面向实现编程

本文通过一个轮胎品牌的具体案例,对比了面向实现编程与面向接口编程的不同。阐述了面向接口编程如何提高代码的灵活性和可复用性。

面向接口编程与面向实现编程

最近拜读了四人组的经典名作《设计模式 可复用面向对象软件的基础》一书,打算以博客的形式进行笔记与思考


书中提到了可复用面向对象设计的原则,其中的第一个原则是:

针对接口编程,而不是针对实现编程

其实在使用面向对象语言进行编程的时候,经常不经意间就会涉及书中提到的知识,但是一旦用专门的词汇进行描述时,第一反应就是“诶?这是什么意思?看不懂啊”,只有经过反复的阅读与思考,才意识到这是日常编程经常遇到的问题,并且得到更深的理解

面向实现编程

举个例子,假设有两种品牌的轮胎,普利司通(Bridgestone)和米其林(Michelin),而轮胎的共同特性都是会转(roll)。那么我们可以得到两个类:

class Bridgestone {
    public void roll() {
        System.out.print("Bridgestone is rolling.");
    }
}

class Michelin {
    public void roll() {
        System.out.print("Michelin is rolling");
    }
}

对于一辆装了普利司通轮胎的汽车(Car),汽车的转动(roll)就是轮胎的转动:

class Car {
    public void roll(Bridgestone tire) {
        tire.roll();
    }
}

那如果我装了米其林的轮胎呢?

Car car = new Car();
Michelin tire = new Mechilin();
car.roll(tire);

显而易见,程序将会出错。这就是面向实现编程,变量是指向特定类的实例的。
这种强烈的依赖关系将会大大地抑制编程的灵活性和可复用性。


面向接口编程

如果将这两种轮胎的共同特性提取出来,在转动轮胎的时候,只关注“是轮胎”本身,而不去了解“是什么品牌的轮胎”,问题就迎刃而解了

interface Tire {
    public void roll();
}

class Bridgestone implements Tire {
    public void roll() {
        System.out.print("Bridgestone is rolling.");
    }
}

class Michelin implements Tire {
    public void roll() {
        System.out.print("Michelin is rolling");
    }
}

接口Tire定义了“转动”这个接口,但把实现延迟到了子类中

class Car {
    public void roll(Tire tire) {
        tire.roll();
    }
}

Car car = new Car();
BridgeStone tire1 = new Bridgestone();
Michelin tire2 = new Mechilin();
car.roll(tire1);
car.roll(tire2);

汽车在转动时,并不关注“是什么品牌的轮胎“,只关注”是轮胎“,想怎么转就怎么转

从这个例子我们可以看出,面向接口编程的特性:

客户无须知道他们使用对象的特定类型,只须对象有客户所期望的接口

客户使用汽车转动轮胎时,无须知道轮胎的特定类型(品牌,对应的子类),只要轮胎有客户所期望的接口(roll)就行了

客户无须知道他们使用的对象是用什么类来实现的,他们只须知道定义接口的抽象类

客户使用Car的roll方法调用轮胎对应的方法时,不需要知道这个轮胎实例是用什么子类实现的,他只需要知道定义转动方法的抽象类(JAVA中的interface)的内容就行了


总结

面向接口的编程方式是面向对象设计的一个原则,使用这种编程思想,我们可以容易地写出具有可复用性的代码,这对于代码的理解和维护具有很大的帮助

1.1.1-1移动通信发展演进 1.1 移动通信网络基础 .zip,网盘文件,永久连接1.1.1-2移动通信发展演进 1.1 移动通信网络基础 .zip1.1.1-3移动通信发展演进 1.1 移动通信网络基础 .zip1.1.2 移动通信的行业应用 1.1 移动通信网络基础 .zip1.2 5G发展的驱动力 1.2 5G发展的驱动力 .zip1.3-15G协议标准化进展 1.3 5G协议标准化进展 .zip1.3-25G协议标准化进展 1.3 5G协议标准化进展 .zip1.4.1-15G终端进展 1.4 5G产业链及生态圈 .zip1.4.1-25G终端进展 1.4 5G产业链及生态圈 .zip1.4.2 5G频谱分配 1.4 5G产业链及生态圈 .zip1.4.3 5G组网演进 1.4 5G产业链及生态圈 .zip1.5-15G全球商用进展 1.5 5G全球商用进展 .zip1.5-25G全球商用进展 1.5 5G全球商用进展 .zip2.1.1-15G组网场景 2.1 5G网络架构 .zip2.1.1-25G组网场景 2.1 5G网络架构 .zip2.1.1-35G组网场景 2.1 5G网络架构 .zip2.1.1-45G组网场景 2.1 5G网络架构 .zip2.1.1-55G组网场景 2.1 5G网络架构 .zip2.1.2.1 5G核心网架构 2.1 5G网络架构 .zip2.1.2.2 5G核心网架构 2.1 5G网络架构 .zip2.1.2.3 5G核心网架构 2.1 5G网络架构 .zip2.1.2.4 5G核心网架构 2.1 5G网络架构 .zip2.1.2.5 5G核心网架构 2.1 5G网络架构 .zip2.1.2.6 5G核心网架构 2.1 5G网络架构 .zip2.1.3 5G承载网架构 2.1 5G网络架构 .zip2.1.4.1 5G无线网架构 2.1 5G网络架构 .zip2.1.4.2 5G无线网架构 2.1 5G网络架构 .zip2.1.4.3 5G无线网架构 2.1 5G网络架构 .zip2.1.5.1 端到端切片 2.1 5G网络架构 .zip2.1.5.2 端到端切片 2.1 5G网络架构 .zip2.1.5.3 端到端切片 2.1 5G网络架构 .zip3.1 ICT技术融合驱动数字经济 3.1 ICT技术融合驱动数字经济 .zip3.2.1.1 物联网 3.2 新技术的特征现状 .zip3.2.1.2 物联网 3.2 新技术的特征现状 .zip3.2.1.3 物联网 3.2 新技术的特征现状 .zip3.2.1.4 物联网 3.2 新技术的特征现状 .zip3.2.2 云计算 3.2 新技术的特征现状 .zip3.2.3 大数据 3.2 新技术的特征现状 .zip3.2.4 人工智能 3.2 新技术的特征现状 .zip3.3 5G+新技术使能垂直行业应用案例 3.3 5G+新技术使能垂直行业应用案例 .zip4.1 5GtoB 产业理解 4.1 5GtoB 产业理解 .zip4.2.1 E2E带宽 4.2 5G基础业务能力介绍 .zip4.2.2 E2E时延可靠性 4.2 5G基础业务能力介绍 .zip4.2.3 移动性 4.2 5G基础业务能力介绍 .zip4.2.4 自主管理 4.2 5G基础业务能力介绍 .zip4.2.5 快速服务 4.2 5G基础业务能力介绍 .zip4.3.1 摄影级视频 4.3 5G 基础业务应用介绍 .zip4.3.2 Cloud XR 4.3 5G 基础业务应用介绍 .zip4.3.3 无人机 4.3 5G 基础业务应用介绍 .zip4.3.4 远程控制 4.3 5G 基础业务应用介绍 .zip4.3.5 无人驾驶 4.3 5G 基础业务应用介绍 .zip5.1 5G行业应用发展趋势 5.1 5G行业应用发展趋势 .zip5.2.1.1 车联网概述 5.2 车联网解决方案 .zip5.2.1.2 车联网概述 5.2 车联网解决方案 .zip5.2.1.3 车联网概述 5.2 车联网解决方案 .zip5.2.2 车联网业务场景需求分析 5.2 车联网解决方案 .zip5.2.3.1 C-V2X演进及关键技术 5.2 车联网解决方案 .zip5.2.3.2 C-V2X演进及关键技术 5.2 车联网解决方案 .zip5.2.3.3 C-V2X演进及关键技术 5.2 车联网解决方案 .zip5.2.3.4 C-V2X演进及关键技术 5.2 车联网解决方案 .zip
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值