面向接口编程技术的核心在于(面向接口编程技术的核心在于哪里)

http://www.itjxue.com  2023-03-02 06:30  来源:未知  点击次数: 

什么是面向接口编程

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程我想就是指按照这种思想来编程吧!实际上,在日常工作中,你已经按照接口编程了,只不过如果你没有这方面的意识,那么你只是在被动的实现这一思想;表现在频繁的抱怨别人改的代码影响了你(接口没有设计到),表现在某个模块的改动引起其他模块的大规模调整(模块接口没有很好的设计)等等。Booch先生那天谈到Interaction Designer,它就是指做这类设计的人,只不过层次更高一些。我想目前我们的软件设计队伍中,这类人是最缺乏的人才之一。1.关于接口的理解。接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,我认为最为理解的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点繁烦。接口的本身反映了系统设计人员对系统的抽象理解。接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象体(abstract class);第二类是对一个体某一方面的抽象,即形成一个抽象面(interface);一个体有可能有多个抽象面。抽象体与抽象面是有区别的。2.设计接口的另一个不可忽视的因素是接口所处的环境(context,environment),系统论的观点:环境是系统要素所处的空间与外部影响因素的总和。任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。3.按照组件的开发模型(3C),它们三者相辅相成,各司一面,浑然一体,缺一不可。面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题我认为:UML里面所说的interface是协议的另一种说法。并不是指com的interface,CORBA的interface,

面向对象的核心是什么?

 面向对象技术是目前流行的系统设计开发技术,它包括面向对象分析和面向对象程序设计。面向对象程序设计技术的提出,主要是为了解决传统程序设计方法——结构化程序设计所不能解决的代码重用问题。

面向对象的编程方法具有四个基本特征:

1.抽象:

抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。比如,我们要设计一个学生成绩管理系统,考察学生这个对象时,我们只关心他的班级、学号、成绩等,而不用去关心他的身高、体重这些信息。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。

2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好的解决了软件的可重用性问题。比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。

3.封装:

封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

4. 多态性:

多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

面向对象程序设计具有许多优点:

1、开发时间短,效率高,可靠性高,所开发的程序更强壮。由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。

2、应用程序更易于维护、更新和升级。继承和封装使得应用程序的修改带来的影响更加局部化。

什么叫IOC(编程术语)

IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

下面我们以几个例子来说明什么是IoC

假设我们要设计一个Girl和一个Boy类,其中Girl有kiss方法,即Girl想要Kiss一个Boy。那么,我们的问题是,Girl如何能够认识这个Boy?

在我们中国,常见的MM与GG的认识方式有以下几种

1 青梅竹马; 2 亲友介绍; 3 父母包办

那么哪一种才是最好呢?

青梅竹马:Girl从小就知道自己的Boy。

public class Girl {

void kiss(){

Boy boy = new Boy();

}

}

然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办?(严重不支持Girl经常更换Boy,#_#)

亲友介绍:由中间人负责提供Boy来见面

public class Girl {

void kiss(){

Boy boy = BoyFactory.createBoy();

}

}

亲友介绍,固然是好。如果不满意,尽管另外换一个好了。但是,亲友BoyFactory经常是以Singleton的形式出现,不然就是,存在于Globals,无处不在,无处不能。实在是太繁琐了一点,不够灵活。我为什么一定要这个亲友掺和进来呢?为什么一定要付给她介绍费呢?万一最好的朋友爱上了我的男朋友呢?

父母包办:一切交给父母,自己不用费吹灰之力,只需要等着Kiss就好了。

public class Girl {

void kiss(Boy boy){

// kiss boy

boy.kiss();

}

}

Well,这是对Girl最好的方法,只要想办法贿赂了Girl的父母,并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。

这就是IOC,将对象的创建和获取提取到外部。由外部容器提供需要的组件。

我们知道好莱坞原则:“Do not call us, we will call you.” 意思就是,You, girlie, do not call the boy. We will feed you a boy。

我们还应该知道依赖倒转原则即 Dependence Inversion Princinple,DIP

Eric Gamma说,要面向抽象编程。面向接口编程是面向对象的核心。

组件应该分为两部分,即 Service, 所提供功能的声明 Implementation, Service的实现

好处是:多实现可以任意切换,防止 “everything depends on everything” 问题.即具体依赖于具体。

所以,我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话,还可以kiss可爱的kitten和慈祥的grandmother。

二、IOC的type

IoC的Type指的是Girl得到Boy的几种不同方式。我们逐一来说明。

IOC type 0:不用IOC

public class Girl implements Servicable {

private Kissable kissable;

public Girl() {

kissable = new Boy();

}

public void kissYourKissable() {

kissable.kiss();

}

}

Girl自己建立自己的Boy,很难更换,很难共享给别人,只能单独使用,并负责完全的生命周期。

IOC type 1,先看代码:代码

public class Girl implements Servicable {

Kissable kissable;

public void service(ServiceManager mgr) {

kissable = (Kissable) mgr.lookup(“kissable”);

}

public void kissYourKissable() {

kissable.kiss();

}

}

这种情况出现于Avalon Framework。一个组件实现了Servicable接口,就必须实现service方法,并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。

另外,J2EE中从Context取得对象也属于type 1。它依赖于配置文件。

IOC type 2:

public class Girl {

private Kissable kissable;

public void setKissable(Kissable kissable) {

this.kissable = kissable;

}

public void kissYourKissable() {

kissable.kiss();

}

}

Type 2出现于Spring Framework,是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。

IOC type 3:

public class Girl {

private Kissable kissable;

public Girl(Kissable kissable) {

this.kissable = kissable;

}

public void kissYourKissable() {

kissable.kiss();

}

}

这就是PicoContainer的组件 。通过构造函数传递Boy给Girl

PicoContainer container = new DefaultPicoContainer();

container.registerComponentImplementation(Boy.class);

container.registerComponentImplementation(Girl.class);

Girl girl = (Girl) container.getComponentInstance(Girl.class);

girl.kissYourKissable();

参考资料

1

2 DIP, Robert C Martin, Bob大叔的优秀论文

3 Dependency Injection 依赖注射,Matrin Fowler对DIP的扩展

4 IOC框架

PicoContainer 优秀的IOC框架

Avalon

Spring Framework

HiveMind

有谁帮我阐述一下:面向接口编程的思想,及其优点?

首先你要知道软件工程的概念是什么!简单的说软件工程就是让程序模块化,把特定的代码逻辑独立封装,只传入参数和返回参数,外部集中调用。这也就是C、c++、java、c#中的方法、函数、类库头文件等体现。

而接口也是基于这个目的产生的。首先说说为什么要用到接口,我是学java的,所以以java举例,前面说了把代码逻辑独立的封装确实能增加代码的重用性,具有更好的性能。

但是同样的问题也产生了,如果系统结构很复杂,多个开发人员就不能做到有效的协作了。就像用零件拼装一辆汽车一样,很多工人一起工作,他们怎么知道哪2个零件之间结合在一起,怎么耦合。这和软件工程很类似,多个开发人员一起开发不同的模块,他们同样也会遇到程序结构耦合的问题,这都是在开发时很令人头疼的问题。

接口就是为解决这个问题诞生的,他把方法和类封装的更彻底,只显示入口参数和返回参数,而具体的实现类,和方法实现都可以完全隐藏起来,这样做就可以制定一个统一的标准,即使因为开发人员人多脑杂,模块间的代码风格和思路不同,也完全不影响整个系统的架构,这样使得系统的复杂性得到有效控制,降低开发的难度和成本。举个生动的例子就是电脑主板的生产商他无法知道他生产的主板上将要用的CPU是什么型号的,用的内存是什么规格的。但是只要制定统一的行业标准,他就可以预留指定的接口,无论你CPU是基于什么工作原理,也无论你内存多大,只要符合此接口的标准,各个原件就能有效协作组成一台电脑。

何谓面向接口编程?其思想实质是什么?

在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程

接口的多态性通过什么实现

多态和接口是紧密关联了,没有接口就根本无法实现多态。多态的意义在于一种接口多种实现。什么是接口,接口就是声明,是一种自定义调用约定或协议,具体怎么做由派生类实现。其实就算是vb的函数也有接口的,其函数名就是接口,只不过vb无法实现接口和实现分离,也就是不存在单独的接口,一个函数名声明必须有一个实现且只能有一个实现。c++的强大就是得益于其声明和实现可以分开,从而可以实现调用一种接口实现不同的功能。在c++中充当接口角色的就是虚基类和纯虚基类,前者可以包含部分实现但必须有一个虚函数,而后者其成员函数必须完全是虚函数,纯虚基类与C#理。你准备去银行存钱,营业员让你填单子,这个存款单就是接口,它包含了协议,你根据需要在上面勾选服务,这个行为类比你将派生类对象绑定到接口,或者说将对象地址赋值给基类指针。你提交存款单,相当于传递指针。银行职员接受你的单子并执行存款服务,职员事先并不知道你要做什么,而是根据你提交的单子执行任务,不同的任务对应不同的派生类对象,也就是不同的对象执行特定的任务,这就是多态。多态是面向对象的核心之一,面向接口编程也是以面向对象编程为核心。 接口就是一种规范,我们平时编程要融入生活,比如说电脑的主板,上面有很多接口,插CPU得接口只要插上CPU就可以工作,不管它是哪个厂家生产的CPU。

(责任编辑:IT教学网)

更多

推荐Oracle认证文章