面向接口编程
项目开发过程中论“面向接口编程”的重要性

项⽬开发过程中论“⾯向接⼝编程”的重要性刚刚领导了⼀轮新项⽬开发,在开发过程中⾄始⾄终坚持“⾯向接⼝编程”的原则,并基于此原则进⾏分⼯合作,最终较⾼质量的完成了代码编写过程。
总结项⽬过程,深味⾯向接⼝编程思想的重要性,个中滋味与君分享。
⾯向接⼝编程的好处之⼀是,可以站在全局⾓度俯瞰项⽬架构,对项⽬需求有更深层次的理解。
往常我们只归纳项⽬流程以及设计对象,但是对于接⼝的设计没有提前,算是做到哪再想有哪些接⼝,这样很有可能会在没有完全理解整体需求的情况下就开动,造成了后期调试的⿇烦和返⼯。
⾯向接⼝编程的另⼀个好处是,从横向将项⽬切割成⼀个⼀个的剖⾯,特别适合现在分层⽐较复杂且各层权责分明的项⽬架构。
各层之间的交互关⼼的其实是接⼝定义得如何,事先将接⼝确定下来,可以是项⽬⾻架趋于稳定,也可以降低开发中的风险和不可测。
⾯向接⼝编程还有⼀个好处是,使team leader能更好地把控项⽬的开发节奏。
在分⼯阶段,既可以按照功能模块和功能点分⼯,也可以按照层次之间进⾏分⼯。
例如,之前的项⽬开发中,曾经尝试过让不同⼈分别负责前端页⾯和后端服务开发,由于事先未定义好彼此间交互和通信的接⼝,并⾏开发到联调阶段发现,双⽅对于各⾃所需差异很⼤,联调耗时甚⾄⽐开发时间还长,得不偿失。
⽽事先定义好接⼝,甚⾄细化到url和接⼝的命名,参数和返回的类型,则⼤⼤缩短了联调的时间,最终联调时间仅占开发时间的五分之⼀不到,效果明显。
在单元测试阶段,由于接⼝固定,可以将各层的单元测试提前写好,节省了开发时间。
通过实际项⽬开发的实践,以及对过往项⽬开发的总结,可以深切体会到⾯向接⼝编程这种思想的好处。
接⼝者,通信协议也。
项⽬间协作和配合完全靠⼀个个清晰简约的接⼝实现。
沿着这些接⼝的脉络,能更好地提⾼团队开发效率,促进团队进步。
详解Java中的面向接口编程

详解Java中的面向接口编程在Java编程中,面向接口编程是一种重要的编程思想和实践方式。
通过面向接口编程,我们可以实现代码的灵活性、可扩展性和可维护性。
本文将详细介绍Java中的面向接口编程,并探讨其优势和应用。
一、什么是接口?在Java中,接口是一种定义了一组方法的抽象类型。
接口可以看作是一种契约,规定了类应该具有的行为。
通过实现接口,类可以拥有接口定义的方法,并提供自己的实现。
在接口中,我们只定义方法的签名,而不包含具体的实现。
这使得接口成为一种非常灵活的编程工具,可以在不改变接口定义的情况下,实现不同的具体逻辑。
二、为什么要使用面向接口编程?1. 提高代码的灵活性通过面向接口编程,我们可以将程序的依赖关系从具体的实现类解耦,而是依赖于接口。
这样,当需要替换具体的实现类时,只需要修改依赖的接口即可,而不需要修改大量的代码。
这样可以提高代码的灵活性和可维护性。
2. 实现多态面向接口编程可以实现多态。
多态是指在父类或接口类型的引用变量中,可以指向不同子类或实现类的实例。
通过多态,我们可以编写通用的代码,而不需要考虑具体的实现类。
这样可以提高代码的复用性和扩展性。
3. 规范化编程接口定义了类应该具有的行为,通过面向接口编程,我们可以规范化编程。
当多个类实现同一个接口时,它们必须提供相同的方法,这样可以提高代码的一致性和可读性。
三、如何使用面向接口编程?1. 定义接口在使用面向接口编程之前,首先需要定义接口。
接口的定义使用`interface`关键字,例如:```javapublic interface Animal {void eat();void sleep();}```在上面的例子中,我们定义了一个`Animal`接口,规定了`eat()`和`sleep()`两个方法。
2. 实现接口接口只定义了方法的签名,不包含具体的实现。
因此,我们需要通过实现接口来提供具体的逻辑。
实现接口使用`implements`关键字,例如:```javapublic class Cat implements Animal {@Overridepublic void eat() {System.out.println("Cat is eating.");}@Overridepublic void sleep() {System.out.println("Cat is sleeping.");}}```在上面的例子中,我们定义了一个`Cat`类,实现了`Animal`接口,并提供了`eat()`和`sleep()`方法的具体实现。
面向接口编程

抽象类可以有实现的方法,也可以有未实现的方法;接口只有未实现的方法 类可以实现无限个接口,但仅能从一个抽象类继承
6 | Feature title | date
All Rights Reserved © Alcatel-Lucent 2006, #####
什么是面向接口编程 在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供 服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露 其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。
遗传学家:人,猪,树都是生物,但和石头不一样:IDescendable
马列:所有都是物质(能被意识所反映的客观实在 ):IEsse
“面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件灵活 性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具 体实施到代码里的手段
4 | Feature title | date
–交通工具定义成抽象类,汽车、飞机、轮船定义成子类,是可以接受的,因为汽车、飞 机、轮船都是 一种特殊的交通工具 –实现Icomparable接口的类必须要可以进行比较,这是一条规则。如果Car这个类实现了 Icomparable,只是说,我们的Car中有一个方法可以对两个Car的实例进行比较,可能 是比哪辆车更贵,也可能比哪辆车更大,这都无所谓,但我 们不能说“汽车是一种特 殊的可以比较”
– 如果一个类的实例必须使用另一个对象、而这个对象又属于一个特定的类,那么复用性 会受到损害。 如果“使用”类只需要“被使用”类的某些方法、而不是要求“被使用”类与“使用” 类有“is-a”的关系,就可以考虑让“被使用”类实现一个接口、“使用”类通过这个 接口来使用需要的方法,从而限制了类之间的依赖。 Client(客户)—使用实现了IndirectionIF的其他类。 InterdirectionIF(间接接口)—提供间接性,保证Client与Service之间的独立性。 Service(服务者)—实现IndirectionIF,为Client提供服务。
C语言实现面向接口编程

C语⾔实现⾯向接⼝编程今天更新的⽂章,我相信是⼤伙喜欢的,来聊聊⾯向接⼝编程。
不是⼀直都吹嘘着⾯向对象编程吗?怎么今天⼜来⼀个⾯向接⼝编程,很多⼈要说我不讲武德了。
1⾯向接⼝是啥?不⽤慌,其实⾯向接⼝编程不是什么新鲜玩意,说得直⽩点就是函数指针的使⽤,不过我觉得可以形成⼀种编程的思想来指导嵌⼊式程序设计,特别是对于降低代码的耦合还是⽐较奏效的。
⾯向接⼝编程⽐⾯向对象要更⽜吗?为什么不直接玩⾯向对象编程呢?其实bug菌这么多年开发过来,真正把C完完全全⽤⾯向对象的⽅式进⾏编写是⾮常少的,像C++中的继承、多态、虚函数等等⾯向对象特性,如果均⽤C语⾔来维护和实现是⾮常复杂的,并且你还不能保证没有bug。
再说了你写了⼀堆代码让C的特性更加的像C++,那为什么不直接使⽤C++呢?难道你觉得那些特性你能⽤C写得⽐C++更好?别重复造轮⼦了。
不过,话说回来,能够在C语⾔中借鉴⼀些⾯向对象的语⾔特性和思想,确实能够让C代码更加的优雅和灵活,所以今天聊聊⾯向接⼝编程,它仅仅只是⾯向对象的⼀部分,不过在⼀般的嵌⼊式开发中使⽤性价⽐还是⽐较⾼的。
2⾯向接⼝编程话不多说,先上⼀个⾯向接⼝编程的Demo:参考demo:1#include <stdio.h>2#include <stdlib.h>34/******************************************** 5 * Note: 共⽤接⼝的定义 6 * author:bug菌7 *******************************************/8struct Interface {9 int (*Initial)(void* handle);10 int (*Send)(void* handle,char * buff,int count);11 int (*Recv)(void* handle,char * buff);12 int (*Destory)(void* handle);13};1415 /******************************************** 16 * Note: 具体类型的定义 17 * author:bug菌18 *******************************************/19typedef struct _tag_protocolType1 {20 struct Interface bi; //公共通信接⼝21 char* CommTypeName; //通信名称22 //不同通信类型的其他成员......23}protocolType1;242526/******************************************** 27 * Note:其中⼀种报⽂协议的简单接⼝实现 28 * author:bug菌29 *******************************************/30void protocol_Initial(void* handle)31{32 protocolType1* p = ( protocolType1*)handle;33 p->CommTypeName = 'protocolType1'; //可以通过公共接⼝传参访问原对象的所有成员3435 printf('%s Initial\n',p->CommTypeName);36}3738void protocol_Send(void* handle,char * buff,int count)39{40 protocolType1* p = ( protocolType1*)handle;41对于⾃动测试程序框架,接⼝的预留是⾮常重要的,可以通过虚拟接⼝来测试业务逻辑,能够模拟更多实际环境下不同的⼯况来进⾏测试。
面向接口编程的好处

⾯向接⼝编程的好处⾯向接⼝编程⼀些好处:1.⼀个功能的调⽤者只需要关⼼如何使⽤此功能,⽽⽆须关注功能的实现。
如:如我们在main ⽅法中调⽤⼀个client程序,我们只需要Client client = new ClientImpl(),⽆论 ClientImpl 类中定义了多么复杂的成员函数和成员变量(包括javadoc),你都看不到,你也⽆须看到。
2.⾯向接⼝编程便于团队合作,有了统⼀的接⼝(接⼝是公开的,⾥⾯的⽅法都是public的),⽆须担⼼别⼈的程序⽆法使⽤我的实现(他根本就不关⼼)。
假如我们团队正在做⼀个计算器⼩程序,想要计算1+2+...+100=?,product manager 写了⼀个接⼝,让两个员⼯分别实现,他最后看那个程序算法算得快,于是这两个员⼯就对接⼝分别做了实现。
PM只需要写⼀个程序就可以评估他们的算法。
public int getTime(Interface in){int a = System.currentTime();in.run();return Sustem.currentTime()-a;}试想⼀下,如果没有接⼝,这个经理必须分别new这两个员⼯的class,然后调⽤可能不同的⽅法(A:run(), B:go())来运⾏。
3.(回答你的问题)接⼝的继承关注的是功能的扩展,⽽不是代码的修改。
class的继承就是功能性代码的增加。
两者关注的焦点不同。
本⼈观点:我个⼈认为,接⼝⼀旦设计好了,很少需要修改,除⾮业务逻辑或需求有较⼤变动。
多继承的⽤途(只是举个例⼦):如,SUN对⼀项技术写了⼀个规范如J2EE的JMS规范,很多vender在⾃⼰的应⽤服务器(如WebSphere, WebLogic, Jboss等)都要实现这⼀个规范,故且把这个规范叫做接⼝,每个vender想要对这个规范添加⾃⼰独特的功能,怎么办呢?就是⽤接⼝的继承,然后对继承了的接⼝做实现。
举个例⼦:public interface InterfaceA {public void method1();}public interface InterfaceB {public void method2();}public interface InterfaceAB extends InterfaceA, InterfaceB{public void method3();}public class InterfaceAImpl implements InterfaceA {@Overridepublic void method1() {System.out.println("The implemention of InterfaceA.");}}public class InterfaceBImpl implements InterfaceB {@Overridepublic void method2() {System.out.println("The implemention of InterfaceB.");}}public class InterfaceABImpl implements InterfaceAB {@Overridepublic void method1() {System.out.println("The implemention of InterfaceAB(method1).");}@Overridepublic void method2() {System.out.println("The implemention of InterfaceAB(method2)."); }@Overridepublic void method3() {System.out.println("The implemention of InterfaceAB(method3)."); }}public class Main {public static void main(String[] args) {InterfaceA a = new InterfaceABImpl();InterfaceB b = new InterfaceABImpl();InterfaceAB ab = new InterfaceABImpl();a.method1();b.method2();ab.method3();}}利⽤多态(向上转型),我们就可以达到不同vender间接⼝的统⼀。
C#面向接口编程

C#⾯向接⼝编程⾯向接⼝编程就是将对象中的某个功能提取出来作为接⼝,⽽功能的具体实现则交由继承⾃这个接⼝的实现类处理。
⾯向接⼝的好处是降低程序的耦合性,当有新的功能时只需要对新功能进⾏编写,不需要修改已有的代码下⾯是⼀个简单的范例:1//⽗类2public class Duck3 {4protected IFlyBehaviour flyBehaviour;5//可以动态修改对象的某⼀功能的实现6public void SetDuckFly(IFlyBehaviour fb)7 {8 flyBehaviour = fb;9 }10public void DuckFly()11 {12 flyBehaviour.Fly();13 }14 }1516//⼩鸭⼦类,继承鸭⼦类17public class LittleDuck : Duck18 {19public LittleDuck()20 {21 flyBehaviour = new SlowFly();22 }23 }2425//⼤鸭⼦类,继承鸭⼦类26public class BigDuck : Duck27 {28public BigDuck()29 {30 flyBehaviour = new QuickFly();31 }32 }3334//飞⾏为的接⼝,只定义了飞⾏的⽅法⽽未实现35public interface IFlyBehaviour36 {37void Fly();38 }3940//实现快速飞的⾏为类,继承了飞⾏接⼝41public class QuickFly : IFlyBehaviour42 {43public void Fly()44 {45 Console.WriteLine("飞⾏速度⾮常快");46 }47 }4849//实现慢速飞⾏的⾏为类,继承了飞⾏接⼝50public class SlowFly : IFlyBehaviour51 {52public void Fly()53 {54 Console.WriteLine("飞⾏速度⾮常慢");55 }56 }假设作为⽗类的鸭⼦类Duck具有飞⾏的功能,继承⾃它的两个⼦类⼤鸭⼦BigDuck飞得快,⼩鸭⼦LittleDuck飞的慢,通过⾯向接⼝的⽅式进⾏实现,⽽通过⽗类Duck中的SetDuckFly()⽅法,我们还可以在程序运⾏过程中动态的去修改某⼀功能执⾏:1 BigDuck bigDuck = new BigDuck();2 bigDuck.DuckFly();34 LittleDuck littleDuck = new LittleDuck();5 littleDuck.DuckFly();67 littleDuck.SetDuckFly(new QuickFly());8 littleDuck.DuckFly();结果:1飞⾏速度⾮常快2飞⾏速度⾮常慢3飞⾏速度⾮常快。
面向接口编程详解(三)——模式研究

面向接口编程详解(三)——模式研究2008-04-14 11:15 by EricZhang(T2噬菌体), 8491 visits, 网摘, 收藏, 编辑通过前面两篇,我想各位朋友对“面向接口编程”的思想有了一定认识,并通过第二篇的例子,获得了一定的直观印象。
但是,第二篇中的例子旨在展示面向接口编程的实现方法,比较简单,不能体现出面向接口编程的优势和这种思想的内涵。
那么,这一篇作为本系列的终结篇,将通过分析几个比较有深度的模式或架构,解析隐藏其背后的面向接口思想。
这篇我将要分析的分别是MVC模式和.NET平台的分层架构。
这篇的内容可能会比较抽象,望谅解。
1.从MVC开始MVC简介:本文不打算详细解释MVC架构,而是把重点放在其中的面向接口思想上。
所以在这里,只对MVC 做一个简略的介绍。
MVC是一种用于表示层设计的复合设计模式。
M、V、C分别表示模型(Model)、View(视图)、Controller(控制器)。
它们的职责如下:模型:用于存储应用中的数据及运行逻辑,是应用的实体。
视图:负责可视部分,用于与用户交互及呈现数据。
视图只负责显示,不负责将用户的操作行为解释给模型。
控制器:负责将用户的行为解释给模型。
根据指定的策略和用户的操作,调用模型的逻辑。
关于三者的关系,我画了一张图,大家请看:图3.1 MVC模式示意它们之间的交互有以下几种:1.当用户在视图上做任何需要调用模型的操作时,它的请求将被控制器截获。
2.控制器按照自身指定的策略,将用户行为翻译成模型操作,调用模型相应逻辑实现。
3.控制器可能会在接到视图操作时,指定视图做某些改变。
4.当模型的状态发生改变时,将通过某种方式通知视图。
5.视图可以从模型获取状态,从而改变自己的显示。
MVC介绍完了,那么可能会有人问,我们的主题呢?面向接口思想呢?其实,MVC中处处都存在面向接口的影子。
下面,我对其中几个侧面进行解释。
1.首先我们可以看到,视图和模型是有直接交互的,也就是上面的4、5两点。
面向接口编程详解(二)——编程实例

面向接口编程详解(二)——编程实例问题的提出定义:现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。
上下文(环境):已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的移动存储设备,所以计算机必须有扩展性,能与目前未知而以后可能会出现的存储设备进行数据交换。
各个存储设备间读、写的实现方法不同,U盘和移动硬盘只有这两个方法,MP3Player还有一个PlayMusic 方法。
名词定义:数据交换={读,写}看到上面的问题,我想各位脑子中一定有了不少想法,这是个很好解决的问题,很多方案都能达到效果。
下面,我列举几个典型的方案。
解决方案列举方案一:分别定义FlashDisk、MP3Player、MobileHardDisk三个类,实现各自的Read 和Write方法。
然后在Computer类中实例化上述三个类,为每个类分别写读、写方法。
例如,为FlashDisk写ReadFromFlashDisk、WriteToFlashDisk两个方法。
总共六个方法。
方案二:定义抽象类MobileStorage,在里面写虚方法Read和Write,三个存储设备继承此抽象类,并重写Read和Write方法。
Computer类中包含一个类型为MobileStorage 的成员变量,并为其编写get/set器,这样Computer中只需要两个方法:ReadData和WriteData,并通过多态性实现不同移动设备的读写。
方案三:与方案二基本相同,只是不定义抽象类,而是定义接口IMobileStorage,移动存储器类实现此接口。
Computer中通过依赖接口IMobileStorage实现多态性。
方案四:定义接口IReadable和IWritable,两个接口分别只包含Read和Write,然后定义接口IMobileStorage接口继承自IReadable和IWritable,剩下的实现与方案三相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实例
8
实例
public class MyClass { private Checker checker; public void setChecker(Checker checker){ this.checker = checker; } public void login(User user){ if (checker.isValidUser(user)) { System.out.println("User is logged in."); }else{ System.out.println("User is not logged in."); } } }
4
接口的典型应用
• Java Message Service (JMS)
– 43个接口。 – 2个类。
• java.sql
– 22个接口。 – 7个类。
Java EE 6
5
什么时候使用接口?
• 构建软件框架。 • 分离功能定义和功能实现。 • 降低组件之间的耦合度。
6
如何使用接口?
接口的典型应用形式
11
如果不使用接口?
• • • • • 难以进行软件架构的设计。 对象之间紧密耦合。 软件可扩展性差。 开发人员之间难以合作。 随着开发深入,编程工作陷入泥沼。
12
– 接口是方法定义和常量值的集合。
• 设计层面:
– 接口是功能定义的集合。 – 接口是面向对象系统中最抽象的元素。 – 接口是设计软件、构建软件框架的基本要素。源自2软件的认知与实现
• 对软件的理解过程
抽象 具体
• 软件的实现过程
接口 类
3
为什么要使用接口?
• • • • 标识系统中的对象。 定义组件应实现的功能。 定义组件之间交互的规则。 接口的副产品——多态。
Program to an interface, not an implementation
面向接口编程
1.什么是接口? 2.为什么要使用接口? 3.什么时候使用接口? 4.如何使用接口? 5.如果不使用接口?
1
什么是接口?
• 面向接口编程是面向对象程序设计的核心。 面向接口编程是面向对象程序设计的核心。 • 实现层面:
9
实例
10
实例
public class CheckerImpl implements Checker { DataProvider dp = null; public void setDataProvider(DataProvider dp){ this.dp = dp; } public boolean isValidUser(User aUser) { boolean isValidUser = false; User user = (User) dp.getData("Some search criteria."); if (user.equals(aUser)){ isValidUser = true; } return true; } }