go接口

本文介绍了Go语言中接口的概念及其在实现多态性中的作用,通过实例展示了如何使用接口避免模块功能过于臃肿,遵循面向对象的开闭原则。通过创建抽象接口,实现了业务模块的扩展而不修改原有代码,降低了代码维护成本,提高了系统的稳定性。
摘要由CSDN通过智能技术生成

一.接口就像一种抽象类
1.interface 是方法声明的集合
2.任何类型的对象实现了在interface 接口中声明的全部方法,则表明该类型实现了该接口。
3.interface 可以作为一种数据类型,实现了该接口的任何对象都可以给对应的接口类型变量赋值。
注意:
  a. interface 可以被任意对象实现,一个类型/对象也可以实现多个 interface
  b. 方法不能重载,如 eat(), eat(s string) 不能同时存在
package main

import “fmt”

type Phone interface {
call()
}

type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
fmt.Println(“I am Nokia, I can call you!”)
}

type ApplePhone struct {
}

func (iPhone ApplePhone) call() {
fmt.Println(“I am Apple Phone, I can call you!”)
}

func main() {
var phone Phone
phone = new(NokiaPhone)
phone.call()

phone = new(ApplePhone)
phone.call()

}
上述中体现了interface接口的语法,在main函数中,也体现了多态的特性。
同样一个phone的抽象接口,分别指向不同的实体对象,调用的call()方法,打印的效果不同,那么就是体现出了多态的特性。
二.面向对象中的开闭原则
2.1 平铺式的模块设计
那么作为interface数据类型,他存在的意义在哪呢? 实际上是为了满足一些面向对象的编程思想。我们知道,软件设计的最高目标就是高内聚,低耦合。那么其中有一个设计原则叫开闭原则。什么是开闭原则呢,接下来我们看一个例子:

package main

import “fmt”

//我们要写一个类,Banker银行业务员
type Banker struct {
}

//存款业务
func (this *Banker) Save() {
fmt.Println( “进行了 存款业务…”)
}

//转账业务
func (this *Banker) Transfer() {
fmt.Println( “进行了 转账业务…”)
}

//支付业务
func (this *Banker) Pay() {
fmt.Println( “进行了 支付业务…”)
}

func main() {
banker := &Banker{}

banker.Save()
banker.Transfer()
banker.Pay()

}

代码很简单,就是一个银行业务员,他可能拥有很多的业务,比如Save()存款、Transfer()转账、Pay()支付等。那么如果这个业务员模块只有这几个方法还好,但是随着我们的程序写的越来越复杂,银行业务员可能就要增加方法,会导致业务员模块越来越臃肿。

​ 这样的设计会导致,当我们去给Banker添加新的业务的时候,会直接修改原有的Banker代码,那么Banker模块的功能会越来越多,出现问题的几率也就越来越大,假如此时Banker已经有99个业务了,现在我们要添加第100个业务,可能由于一次的不小心,导致之前99个业务也一起崩溃,因为所有的业务都在一个Banker类里,他们的耦合度太高,Banker的职责也不够单一,代码的维护成本随着业务的复杂正比成倍增大。

2.2 开闭原则设计
那么,如果我们拥有接口, interface这个东西,那么我们就可以抽象一层出来,制作一个抽象的Banker模块,然后提供一个抽象的方法。 分别根据这个抽象模块,去实现支付Banker(实现支付方法),转账Banker(实现转账方法)
如下:

那么依然可以搞定程序的需求。 然后,当我们想要给Banker添加额外功能的时候,之前我们是直接修改Banker的内容,现在我们可以单独定义一个股票Banker(实现股票方法),到这个系统中。 而且股票Banker的实现成功或者失败都不会影响之前的稳定系统,他很单一,而且独立。

所以以上,当我们给一个系统添加一个功能的时候,不是通过修改代码,而是通过增添代码来完成,那么就是开闭原则的核心思想了。所以要想满足上面的要求,是一定需要interface来提供一层抽象的接口的。

golang代码实现如下:

package main

import “fmt”

//抽象的银行业务员
type AbstractBanker interface{
DoBusi() //抽象的处理业务接口
}

//存款的业务员
type SaveBanker struct {
//AbstractBanker
}

func (sb *SaveBanker) DoBusi() {
fmt.Println(“进行了存款”)
}

//转账的业务员
type TransferBanker struct {
//AbstractBanker
}

func (tb *TransferBanker) DoBusi() {
fmt.Println(“进行了转账”)
}

//支付的业务员
type PayBanker struct {
//AbstractBanker
}

func (pb *PayBanker) DoBusi() {
fmt.Println(“进行了支付”)
}

func main() {
//进行存款
sb := &SaveBanker{}
sb.DoBusi()

//进行转账
tb := &TransferBanker{}
tb.DoBusi()

//进行支付
pb := &PayBanker{}
pb.DoBusi()

}
再看开闭原则定义:
开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
简单的说就是在修改需求的时候,应该尽量通过扩展来实现变化,而不是通过修改已有代码来实现变化。
通俗理解:
如果仅仅对一个结构体来说,肯定会觉得差不多,如果一个业务有非常多的结构体,你改一个就需要改很多,所以把业务抽离出来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值