在现实生活中,我们会对事物建模,将事物模拟成对象,对象是现实世界映射到程序语言的模型,是实际待解问题的抽象,这就是OOP语言的抽象机制。假设一个人,有状态和行为之分,如状态有悲伤、高兴...行为有跑、跳、唱歌。犹如对象有字段和方法一样,方法就是用来改变状态(字段)从而产生“副作用”或者更常见的得到一个返回值,这些基本的OOP概念我就不多说了,学Java的都知道。。
如果有很多对象都有共同的“面貌”,我们就会想到把它们抽象成一个接口。我们这里讨论的不是多态和向上转型机制,也不是给你讲何时用abstract何时用interface,而是讲实现接口和被操作对象的关系,是接口与对象分离呢?还是将接口封装在对象中?
首先来讨论第一种:接口与对象的分离。大多数人会想到为对象写一个简单的JavaBean,然后将接口在另一个文件中实现,通过import机制把JavaBean导入接口实现中,而在实际应用的时候只是调用接口实现的方法,就能轻而易举的对JavaBean进行操作。但是,如果在项目很大的时候,JavaBean很多的时候,这么多接口该怎么管理呢?看到这里,我们是不是再抽象下,我们把这么多接口放进一个“工厂”里,然后所有的Bean通过这个“工厂”完成我们对它们的“加工”(操作)。这就是工厂模式,这样做的好处是:你提供给我一个工厂,我不管这个工厂里有些什么,我只管我的原料(JavaBean)通过你那个工厂就会得到我想要的产品(结果)!这也说明,设计模式它不是工具,而是一种思想!
还有一种情况,如果接口对于某个对象改变其行为只占很少的分量,亦即是说这个对象自己本身也有很多方法,而接口只是与其他对象有相似的面貌罢了,那么我们还要花费心思单独写一个接口实现吗?答案当然不是,我们何必不把这个接口封装在对象中呢?接口也是类,这样我们就想到了内部类,对!就是内部类!考虑下面一段代码:
interface Selector
{
boolean end();
Object current();
void next();
}
public class Sequence
{
private Object[] objects;
private int next = 0;
public Sequence(int size){objects = new Object[size];}
private class SSelector implements Selector
{
private int i = 0;
public boolean end(){return i == objects.length;}
public Object current(){return objects[i];}
public void next(){if(i<objects.length)i++;}
}
public Selector getSelector(){return new SSelector();}
//...代码没写完,只是勾出了大致的轮廓
}
我们用内部类的方式将Selector的接口实现了,然后用一个方法getSlelector来返回这个内部类对象生成的引用,这样就相当于我们把接口用一个方法实现了,只要:
Sequence sequence = new Sequence();
Selector selector = sequence.getSequence();
就可以取得操纵sequence对象中字段的接口,这样感觉是不是把接口封装在一个对象了?更确切地说是封装在对象中的一个方法中了!当某个外围类的对象创建了一个内部类对象时,此内部类对象必定会保存一个指向那个外围类对象的引用。这就是为什么内部类自动拥有对外围类所有成员的访问权。
试想一下,如果Sequence.java不使用内部类,就必须声明“Sequence是一个Selector”。对于某个特定的Sequence只能有一个Selector。但使用内部类就很容易拥有另一个方法getRSelector(),用它来生成一个反方向遍历序列的Selector。
这篇文章不是来列举内部类的好处的,内部类的好处不止这些,他在某些设计模式里面占有很重要的位置,比如java swing,它是swing应用程序框架实现的主要方法,也使GUI程序变得如此优美,我最喜欢的就是Java的优美。
分享到:
相关推荐
籍由故意设计而成的TInterfacedObject和TMyInterfacedObject2个类,得到4个实例对象,4个接口指针,并且演示了在编译器实现过程中,对象模型的空间状态,接口指针,接口方法表格种种复杂的关系。因为我的操作系统是...
我想,对于各位使用面向对象编程语言的程序员来说,“接口”这个名词一定不陌生,但 是不知各位有没有这样的疑惑:接口有什么用途?它和抽象类有什么区别?...和面向对象编程是什么关系?本文将一一解答这些疑问。
ArcEngine-所有类和接口的关系图(最全)【10.2】
Java面向对象设计 - Java接口 什么是接口? Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。...
\\java类、抽象类、接口、继承和对象解析 .doc
对象管理关系如下: TDataFactory | --- TCHintForm | --- TCDataSetConnect | --- TCDataSetThread | --- TCDataSet | --- TCQuery | --- TCStoredProc | --- TParamItem 注意:代码运行时,请...
华为 C++ 培训资料 经典 ...word讲解C++语言中级教材讲授C++语言的运用技术,包括:类、对象之间的关系、对象的存储与布局、运算符重载、智能指针、仿函数、泛型编程,C++模式设计基本思想。下载看吧
客户端对象件的包含关系图 比如这辆汽车、这个人、这间房子、这张桌子、这株植物、这张支票、这件雨衣。 概括来说就是:万物皆对象。 面向对象(ObjectOriented,OO)是当前计算机界关心的重点,它是90年代软件开发...
作为后关系型数据库,它整合了对象数据库访问、高性能的SQL访问、强大的多维数据访问——这三种方法能够天衣无缝地同时访问相同的数据。数据只要在单一的整合 数据字典中描述一次,就可以被这三种方法访问。Caché...
定义接口及各类,明确他们的继承关系。 3、在实验2中所实现的Teacher类的基础上,修改Teacher类的代码,要求:由多个Teacher对象所形成的数组可以使用Arrays.sort方法进行排序(编号由低到高排序)。
java开发环境的配置 划时代的Java语言 Java数据处理 Java程序控制 Java类与对象 深入Java类 对象关系研究 接口与抽象类 异常处理与垃圾回收
(4) 有一组接口:除施加于对象内部的操作外,对象还提供了一组公有操作用于与外界接口,从而可以与其他对象建立关系。 【1.5】 【解】 在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作...
在面向对象的设计中,经常会用到有类似父子关系的这个对象,比如在我现在的一个项目中,有订单对象,在一个订单下又包含多个产品,这时我就想用 Iterator模式来封装订单下的产品,在dot Net中的IEnumerator接口就是...
2 面向对象语言与面向过程语言的区别 7 3 面向对象?什么对象? 8 4 什么是类? 9 5 如何创建一个类Class? 10 6 如何使用类创建对象 10 7 引用与实例 11 8 实例属性与实例方法 11 9 实例属性与实例方法的使用 12 10...
5.6 各种内存分配方式的关系与比较 148 5.6.1 标准C内存管理函数与Windows内存管理API的关系 149 5.6.2 功能性区别 149 5.6.3 效率的区别 149 第6章 进程、线程和模块 150 6.1 基本概念 150 6.1.1 ...
很不错的模型图,非常详细,介绍了类库之间的关系,以及类的属性和方法
5.6 各种内存分配方式的关系与比较 148 5.6.1 标准C内存管理函数与Windows内存管理API的关系 149 5.6.2 功能性区别 149 5.6.3 效率的区别 149 第6章 进程、线程和模块 150 6.1 基本概念 150 6.1.1 应用...
本章通过对象的多态性讲解了抽象类与接口的实际应用,并通过实例讲解了抽象类与接口的关系及使用,并简单介绍了适配器与工厂设计模式。
此外,本书还讨论了各种与面向对象概念密切相关的应用主题,包括XML、UML建模语言、持久存储、分布式计算和客户/服务器技术等。 本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业...
(4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中 (5) 抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个...