`

面相接口(抽象)编程

阅读更多

http://liuwaner118.iteye.com/blog/2271655

引言:    

    "面相接口编程" 是OO 编程人员经常会碰到的名词, 初学者可能在刚开始的时候,对这些名词不是很理解,过于这个概念的资料,网上一搜也是一大片.不过相比于其他文章较为抽象的解释,本文想通过一个比较接地气的例子来阐述下 " 面相接口编程" (面相抽象编程)的某些个方面的特点, 不敢保证让你完全掌握"面相接口编程"的概念,但我想如果你仔细阅读如下文字的话,最起码再下次遇到这个名词的时候,会稍微有点感受. 
一、例一: 
    好了,官方的定义我就不摆了,直接说例子. 以java为例哈.  比如说现在有一个集合 这个集合里面呢放男人(Man类),这个 Man类呢有两个属性,(height,wearShirt),分别对应身高,和"是否穿了衬衫" 这两个属性.  以上这些是初始条件, 好了,接下来博主就要发问了:   写一个工具类,请找出集合中帅的人?  那每个人对于帅的定义不同, 可能有些女孩子认为180cm以上的就挺帅的(吐舌头肤浅..),又有可能有些人认为穿白衬衫的男孩子就挺帅的. 那这句话怎么说才正确呢? ,  我说,满足帅的条件的男人是帅的. 这句话准没错吧?   这里的"帅的条件" 就是一个抽象的概念, 抽象一般来说都是较为稳定的,就像上面我说的"满足帅的条件的人都是帅的" 这句话在任何情况下都是准确的,所以面相抽象(接口)的代码也是稳定的.(就比如如下代码中ListUtils工具类的 filter方法,无论帅的标准怎么变,这段代码的逻辑都是正确的)., 以下是完整的代码. 
Java代码   收藏代码
  1. public interface Rule<T> {            //帅的标准  
  2.  boolean meetCondition(T t);      //是否满足帅的条件  
  3. }  
  4.   
  5. // 工具类  
  6. class final ListUtils{  
  7.   
  8.     public static <T> List<T> filter(List<T> list, Rule<T> rule) {  
  9.         List<T> result = new ArrayList<T>();  
  10.         for (T t : list) {  
  11.             if (rule.meetCondition(t))  
  12.                 result.add(t);  
  13.         }  
  14.         return result;  
  15.     }  
  16. }  
  17.   
  18. //客户端代码  
  19. public static void main(String[] args) {  
  20.     //找出集合中帅的人  
  21.        listUtils.filter( manList, new Rule<Man>(){  
  22.            public boolean meetCondition(Man man){  
  23.                  return man.getHeight>180;   
  24.            }  
  25. }  
 
 总结: 所以说,面相接口编程就是将问题中稳定的部分抽象出来,并建立模型, 具体的实现由客户端来决定. 一个很经典的范例就是jdbc, jdbc 只是制定了 访问数据库的规范(即把访问数据库的步骤给抽象出来),针对于不同的数据库,对应不同的驱动(即实现).   可能大家已经发现了,上面举得例子其实就是对应对java中闭包的应用. 关于闭包,在很多面相对象的语言中也是一个重要的概念. 特别是js中,闭包是很大的一块内容. 从上面的例子不难发现,闭包其中的一个优点就是有效的消除了模版化的代码, 想象一下,如果不把过滤过程给抽象出来,是不是当过滤的规则变动的时候,每次写过滤函数的时候都得写一遍for() 循环, 其实写这种过滤函数,我们主要在乎的是什么样的内容应该留下,什么样的内容应该剔除,这个剔除的逻辑其实才是我们所关心的. 这个例子其实就是对应js中的filter 函数 , 象js中类似的还有  every(), each(), any(), 这些函数.  其实原理都一样,都是面相接口(抽象)编程思想的一种应用而已.  当然上述所述的只是面向接口编程中的其中一点,但也是最重要的一点.
二、例二

现在有一个computer类还有一个MP3u盘类,因为computer类要为MP3类和u盘类提供一个usb插入接口,如果没有面向接口的编程,computer类就要为不同的设备提供不同的链接的方法,程序的可维护性变的很差,但是如果我们利用了面向接口的编程方法,我们只要定义一个链接的接口connect,然后让不同的设备实现这个接口,并且重写接口中的方法,现在我们的computer类只要与这个ConnectToUsb接口产生关系就可以了,不用再与具体的设备产生关系,这样就大大降低了类与类之间的耦合性。以后当有需要加入更多的链接设备的时候只需要实现这个接口就可以了。

Computer类:

 

[java] view plaincopy
  1. public class Computer {  
  2.     private ConnectToUsb connectToUsb;//定义一个接口类型的成员变量  
  3.   
  4.     public ConnectToUsb getConnectToUsb() {  
  5.         return connectToUsb;  
  6.     }  
  7.     //接的要赋值  
  8.     public void setConnectToUsb(ConnectToUsb connectToUsb) {  
  9.         this.connectToUsb = connectToUsb;  
  10.     }  
  11.     public void connect() {  
  12.         connectToUsb.connect();  
  13.     }  
  14. }  

ConnectToUsb接口:

 

 

[java] view plaincopy
  1. public interface ConnectToUsb {  
  2.     public abstract void connect();  
  3. }  
MP3类:

 

 

[java] view plaincopy
  1. public class MpThree implements ConnectToUsb{  
  2.   
  3.     @Override  
  4.     public void connect() {  
  5.         System.out.println("MP3 To Connect!");  
  6.     }  
  7.   
  8. }  
测试类:

 

 

[java] view plaincopy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Computer c = new Computer();  
  4.         MpThree m = new MpThree();  
  5.         c.setConnectToUsb(m);  
  6.         c.connect();  
  7.     }  
  8. }  
分享到:
评论

相关推荐

    PHP面向对象(OOP)编程完全教程.pdf

    面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件程序和数据结构。对象可以包含数据,以字段的形式存在,也包含代码,以方法的形式存在。OOP的概念基于现实世界,对象类似于现实世界中的实体,例如,...

    PHP_面向对象教程(强力推荐).pdf

    20. 抽象方法和抽象类,用于声明接口,具体实现由子类完成。 21. PHP5接口技术,定义方法的集合,但不提供具体实现。 以上介绍的面向对象编程概念和技术点不仅适用于PHP语言,也适用于其他支持面向对象特性的编程...

    我的Java面相对象考试复习资料

    5. **抽象**:抽象是简化复杂现实的一种手段,它通过抽象类或接口来定义通用的特征。抽象类不能被实例化,但可以有子类继承;接口则是一种完全抽象的类型,用于规定实现它的类必须提供的方法。 6. **构造器**:构造...

    java之面向对象 附源代码

    此外,Java提供了抽象类(abstract class)和接口,抽象类可以包含抽象方法(没有实现的方法),而接口则完全由抽象方法组成,是实现多继承的一种方式。 5. 接口与实现: 接口在Java中扮演着规范和契约的角色,定义...

    面相对象技术作品基于java 控制台 商品库存管理系统

    4. 抽象:抽象是提取共性特征并创建抽象类或接口的过程。在这个系统中,可能有一个抽象的`库存管理`接口,定义了库存操作的基本方法,然后由具体的商品类实现这些接口方法。 除了面向对象设计,这个系统还涉及到...

    面向对象程序设计Java.ppt

    - 接口是完全抽象的类,只能包含常量和抽象方法。它用于定义一类对象的行为规范,实现了接口的类必须实现接口中的所有抽象方法。 7. 抽象类与抽象方法: - 抽象类不能被实例化,它是为了被继承而存在的。抽象方法...

    实现面相连接的网络通信

    此外,MFC还提供了`CSocket`类,它是`CAsyncSocket`的子类,提供了更高级别的抽象,简化了网络通信的编程。如果你对同步编程感到困难,可以考虑使用`CSocket`进行学习。 总的来说,实现面向连接的网络通信需要对TCP...

    详解C#面相对象编程中的继承特性

    在C#面向对象编程中,继承是一个至关重要的概念,它允许我们创建新的类,这些类可以从现有的类(称为基类)继承属性和行为。通过继承,我们能够复用代码,提高代码的可维护性和可扩展性。以下是关于C#继承特性的详细...

    c++面相对象程序设计课件.rar

    6. **C++ 面向对象程序第8章.ppt**:可能会探讨C++中的接口(Interface),即纯虚函数的使用,以及接口类在设计中的作用。 7. **C++ 面向对象程序第10章.ppt**:可能涉及到C++的异常处理机制,这是程序错误报告和...

    讲解C#面相对象编程中的类与对象的特性与概念

    面向对象编程(OOP)相较于面向过程编程,提供了更高级别的抽象和封装,使得代码更加模块化和易于维护。在C#中,类是创建对象的基础,它是类型定义的蓝图,包含了数据(字段)和行为(方法)。 类的定义: 在C#中,...

    面相对象可以用的一些工具栏图标

    类图标可能有不同的颜色或样式,以区分接口、抽象类和普通类。 2. 对象图标的表示:对象是类的实例,图标可能显示为一个小窗口或容器,里面可能包含代表该对象属性和方法的小图标。 3. 方法和函数图标:方法和函数...

    java连接数据库课程设计.doc

    在学习了图形界面设计后,学生将深入到面向对象编程的核心概念——抽象类与接口。抽象类的作用在于能够定义一系列子类共同的行为,而接口则用来规定必须实现的方法。这使得Java程序能够具有良好的模块化和可扩展性。...

    小游戏(VS2008 面向对象)

    4. **抽象**:通过定义抽象类或者接口来描述一类对象的共同特征,提供了一种模型化的方式。 在俄罗斯方块游戏中,面向对象编程的应用可能体现在以下几个方面: - **游戏板**:可以是一个对象,包含二维数组表示游戏...

    c++面相对象程序设计课件

    - **封装** 是面向对象编程的重要特性,它隐藏了对象的内部细节,只对外提供公共接口。在C++中,通过访问修饰符(如public、private、protected)来控制成员的可见性,以实现信息隐藏,增强代码的安全性和可维护性...

    面向对象分析设计原则

    - **对接口编程**:优先使用接口作为交互方式,以减少对具体实现的依赖。 - **对象组合优于类继承**:尽量利用对象组合来实现功能,而不是滥用继承,特别是没有现实生活中父子关系的情况。 - **分离可变与不可变*...

    C++面向对象教材

    6. **抽象类与接口**:抽象类包含至少一个纯虚函数,不能被实例化,常用于定义接口。接口提供了一种规范,让不同的类可以遵循统一的标准进行通信。 7. **模板与泛型编程**:虽然不是面向对象特性,但C++的模板允许...

    php面向对象基础详解【星际争霸游戏案例】

    在编程领域,面向对象是一种重要的编程范式,它将现实世界中的实体抽象为类,通过类来描述对象的属性和行为。PHP自5.0版本开始全面支持面向对象编程,使得开发者能够更有效地组织代码并实现复用。下面我们将结合星际...

    程序员面试题软件工程生命周期,设计模式的原则,面向对象

    4. **抽象**:通过抽象类或接口来定义一个类族共同的特征和行为,而具体的实现则留给子类去完成,提高了代码的复用性和灵活性。 ### 示例:工厂模式 工厂模式是面向对象设计模式之一,用于提供创建对象的接口,但...

    php面向对象的教程

    - **抽象类与接口**:抽象类不能实例化,主要用于定义必须由子类实现的方法。接口定义了一组方法签名,强制实现这些方法的类必须提供具体实现。 - **封装**:确保对象的状态和行为仅通过预定义的接口进行访问和修改...

    山东大学面对对象纸牌实验

    1. 类与对象:实验中,每个游戏元素(如纸牌、玩家、牌堆)都可以抽象为类,每个类实例化为对象。例如,创建一个`Card`类来表示单张纸牌,包含花色和数字属性;`Player`类表示玩家,拥有手牌集合;`Deck`类表示牌堆...

Global site tag (gtag.js) - Google Analytics