前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从接口到工厂 设计模式也很简单

从接口到工厂 设计模式也很简单

作者头像
用户5745563
发布2019-07-04 14:49:10
4260
发布2019-07-04 14:49:10
举报
文章被收录于专栏:码思客码思客
接口这个东西对于新手来说确实有点不好理解,上一章 说了那么多,其实总结起来就是,接口用来制定标准。

本章从代码的角度再来解读一下接口这个知识点。嗯~辣条既然那么好吃,本章先继续吃吃辣条。。。

接口的定义与实现

接口里面90%都应该是抽象方法,在java8以后,除了抽象方法,接口里面还可以有默认方法等一些成员。

接口用interface关键字来定义,用implements关键字来实现接口,这里首先定义一个抽象的标准来约束各种标准,然后定义一个辣条类实现接口。

接口的定义与实现

这里用一个具体的辣条实现了标准,然后创建了辣条的对象,将对象赋值给标准的变量,这是多态的一种实现方式。

多态不仅仅在父类和子类之间实现,也可以在接口与实现类之间实现。接口实现多态有一个重要的意义,他体现了一种可插拔的设计思想。

比如这里,如果要修改辣条的标准规范,比如一个规范执行久了,可能会有新的更符合当前情况规范出来,我们不需要去修改原来的标准,而是直接用新的标准代替原来的标准即可。

可插拔的设计思想

对修改关闭,对扩展开放,这是我们写代码的原则。修改会带来很多麻烦,所以使用接口的可插拔思想,可以使我们避免修改老的代码,直接用新的代码代替他。

这里要注意的是,当我们用父子关系实现多态的时候和用接口实现多态的时候,概念是不同的。

接口的继承

我们上一章说了,辣条如果想要在不同的地方销售,是需要遵守不同地方的标准的,所以我们要对这个接口进行一下扩展。

java里面类是单继承,可是接口是可以多继承的,我们上一章也说了,可以用一个标准去同时继承两个标准,再来实现它。

接口多继承

接口的多继承使用逗号分开,有了多继承,可以很方便的在多个标准中进行组合,需要哪些标准的组合,直接继承即可。

假设我们的辣条在A,B地都符合标准了,去了C地,又来个标准,我们完全可以通过多继承再“组合”出一个新的标准,这样我们也无需修改代码,在系统的设计上会灵活许多。

接口的应用

“ 接口到底有什么用?” 很多入门级新手经常会被这样一个问题困扰很久,下面我们就详细说说接口的作用。

接口在很多方面都有大作用,这里举几个例子来理解接口的作用,首先来看看数据库。

数据库有很多种,常用的有mysql和oracle,我们的代码如果想要与数据库通讯,就必须使用对应的数据库驱动包。现在有这样一个场景,假设我的程序连接了两个数据库,我要根据用户的请求来查询不同的数据库,怎么办。

普通玩家的做法是这样:

普通玩家

要满足要求很简单啊,写两个类,一个连接mysql,一个连接oracle不就完了。然后在调用的时候根据参数选择需要连接哪个数据库就完了,打完收工~

你真按这个思路写的话,打完肯定就下岗了。其实写代码最大的问题不在于写完的时候你觉得你多么厉害,多么有效率,而是一旦要修改的时候,才能发现你到底厉不厉害。

假设我要新加一个数据库postgresql,我首先要在被调用方新增一个类,实现连接数据库的方法,然后在调用方还要改代码!main方法就是调用方,需要再加一个else if 的判断,判断是否postgresql。

我们写代码的原则是修改要对调用者透明,就是说你改了代码,不要让调用你功能的地方都一起改,如果你一改代码,大家伙都要加班陪你改,你确定还想看到明天的太阳么。

我们再来看看高端玩家怎么做。

高端玩家

看看高端玩家的做法,首先定义一个连接的接口,然后具体的mysql连接类和oracle连接类实现接口。

DataBaseFactory这个类是关键,他将对象的调用和创建分离开来,自己专门的职责就是创建对象,而调用者只管调用。当调用者需要mysql的时候,创建mysql的连接类返回,需要oracle的时候,创建oracle的连接类返回。

在看main方法调用的时候,不管是mysql还是oracle,都直接用接口对象调用方法,不用具体的类去创建对象,这样使程序的灵活性大大增加。

灵活性体现在,一旦需要增加新的数据连接,main方法里一行代码都不需要改变,只需要将参数修改成postgresql就完了。具体需要修改的只是功能的提供方,也就是新增一个postgresql去实现connection接口,然后在DataBaseFactory里面加一个判断即可。

有同学肯定很困扰,你这样搞一大堆,该改的时候还不是要改,有什么区别?

区别就在于,普通玩家需要调用方一起改,要知道一个系统大了,可是不止一个地方有调用的,而高端玩家只需要自己改,调用方不用改,这就是区别。

其实这就是简单工厂模式,工厂就是用来批量创建对象的,不需要调用者自己创建,而是提供者根据调用者的需求来创建,这样设计的好处是,就算我要改功能,对于调用方来说,他是可以完全不关心甚至不用知道。

其实后面学习web的时候,会学习spring这个框架,这个框架里面大量的使用了工厂方法,当然用法更加高级一些,甚至都不需要我们写什么代码,这里跟大家简单介绍一下更高端的玩法,体会一下接口的魅力。

spring

当我们开发一个项目的时候,肯定会大量用到第三方的框架或者开源项目的代码,这样一来,就会有各种各样的调用,如果没有一种规范的方式约束他们,一个系统的复杂程度是难以想象的,比如这样

调用与依赖

红色是调用,就是我调用了某个框架的某个方法。绿色是依赖,就是如果这个框架要能被我使用,就得先让他使用另一个框架的工具,他才能为我提供服务。比如我要烤肉必须依赖炉子,炉子又必须依赖煤炭,依赖关系可以是连续的。

如果没有一个公共的约束,我们的系统就像上面一样,调用错综复杂,依赖无法无天,乱七八糟,最后写代码的就是生不如死。

所以spring为我们定了一个规矩,spring把所有的依赖关系处理好,当我们启动项目的时候,会到spring这个管家这里报道,所有的框架的依赖关系全部记录在册,谁都不能胡来。

注册登记

现在有了spring这个管家是不是用起来舒服多了,我们的程序想要什么直接去找spring要,管家已经帮我们准备好了。

当然,spring可不止这点作用,他的作用大到超乎你的想象,比如除了常规的调用别的框架的方法,还有一些高级玩法。

看上图中的框架J,可以把他理解成一个和数据库有关的框架,他要为我们提供服务,我们总得告诉他我们数据库的账号密码吧,不然他怎么为我们服务?这时候他只需要暴露一个接口,里面写个方法,给我账号密码,OK,我们写一个实现类,然后丢到spring中就完了,框架J会自己去问spring,有没有实现我的接口啊,有的话我就可以提供服务了。

看到了吧,有了接口,就可以为调用方定规矩,按照我的规矩来,我给你提供服务,是不是很厉害。

spring可是博大精深的,以后有机会再给大家讲,本教程还是先教大家打好java基础。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码思客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档