`
xuyuanshuaaa
  • 浏览: 389351 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

接口型模式

阅读更多
1. 抽象类和接口之间的区别:
   在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是 这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

   从设计理念层面看abstract class和interface
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本文将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使 论述便于理解,下面将通过一个简单的实例进行说明。
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
使用abstract class方式定义Door:
    abstract class Door {    
      
    abstract void open();    
      
    abstract void close();    
      
    }    

使用interface方式定义Door:
interface Door {    
  
void open();    
  
void close();    
  
}  

其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。
如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在 本例中,主要是为了展示abstract class和interface反映在设计理念上的区别
解决方案:
   如果我们对于问题领域的理解是:AlarmDoor在概念本质上是Door,同 时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢?前面已经说过,abstract class在Java语言中表示一种继承关系,而继承关系在本质上是"is a"关系。所以对于Door这个概念,我们应该使用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行为,所以报警概念可以通过interface方式定 义。如下所示:
abstract class Door {    
  
abstract void open();    
  
abstract void close();    
  
}  

interface Alarm {    
  
void alarm();    
  
}  

class AlarmDoor extends Door implements Alarm {    
  
void open() { … }    
  
void close() { … }    
  
void alarm() { … }    
  
}  

这种实现方式基本上能够明确的反映出我们对于问题领域的理解,正确的揭示我们的设计 意图。其实abstract class表示的是"is a"关系,interface表示的是"like a"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的
使用abstract class方式定义Door:
   a  一个类可以实现任意多个接口,但它最多只能继承一个抽象类。
   b  一个抽象类可以包含有抽象方法,当然也可以有若干个非抽象方法和属性。但在接口中,无论一个方法是否被显式地声明为抽象的,接口中的方法都是抽象方法,如果有属性则是static final 类型的。
   c  抽象类方法的可见性可以是public、protected、private或者修饰符(表示包内可见);而接口方法的可见性修饰符只能是public。
   d  抽象类可以定义构造器,而接口不行。
   e  继承一个抽象类的各类之间通常具有某种父子关系,而实现某个接口的各个类之间可以没有父子关系。

package com.oozinoz.simultation;

public interface RocketSim
{
    abstract double getMass();
    public double getThrust();
    void setSimTime(double t);
}

下面说明正确的是(A,B,D)

    A.RocketSim接口中的三个方法都是抽象方法,尽管只有getMass()方法显式地声明为抽象的。
    B.RocketSim接口中的三个方法都是公有方法,尽管只有getThrust()方法被显式地声明为公有的。
    C.接口被声明为“公有接口”,即使省略了public关键字,它也应该是公有的。
    D.可以再创建一个接口,如RocketSimSolid接口,并扩展RocketSim接口。
    E.每个接口必须至少含有一个方法。
    F.接口可以声明实例字段,实现该接口的类也必须声明此字段。
    G.虽然不能实例化一个接口,但接口定义可以声明构造器方法,要求实现该接口的类必须提供具有指定参数的构造器。

答案解析:

      接口中的方法总是抽象和公开的,无论是否被显式地声明为abstract及public。

      接口的可见性受限于其所在的包,此处可见性修饰符为public,所以com.oozinoz.simulation包之外的其他类可以访问该接口。

      一个接口可以扩展另一个接口,如List接口和Set接口都扩展了java.util包中的Collection接口。

      不含方法的接口被称为“标记”接口,如Cloneable标记接口。有时候,位于类层次结构高层的方法,如Object.clone()方法,并不适合下面的各个子类。这时,我们可以创建一个标记接口,用于标识哪些子类需要这个方法,哪些子类不需要这个方法。Object类的子类中需要clone()方法的子类可以声明自己实现了Cloneable标记接口。

      接口并不能声明实例字段,不过它可以通过声明static和final修饰的字段来声明常量。

      接口不可以定义构造器方法。Java接口也无法要求实现它的类提供任何特定的构造器方法。
3   适当地使用Java接口能够简化并完善我们的程序设计,尽管有时候这种设计超出了普通接口的定义和使用方法。

       如果期望:将类的外部接口适配客户期望的接口,可应用Adapter模式

       如果期望:为一组类提供一个简单的接口,可以使用Facade模式

       如果期望:为单个对象和群组对象定义共同的接口,可以使用Composite模式

       如果期望:将实现与抽象相分离以便二者独立演化,可以使用Bridge模式

每种设计模式都旨在解决不同环境中的某个问题。面向接口的设计模式通常用于需要对一个类或者一组类的方法的访问方式进行定义或重定义的场合。例如,某个类拥有我们需要的功能,但它的方法名却不满足客户的期望,这时,我们就可以使用Adapter模式。
分享到:
评论

相关推荐

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第2章 接口型模式介绍 8 第3章 适配器(adapter)模式 13 第4章 外观(facade)模式 27 第5章 合成(composite)模式 39 第6章 桥接(bridge)模式 52 第7章 职责型模式介绍 62 第8章 单例(singleton)模式 67 第9章 观察者...

    Python 程序语言设计模式思路-结构型模式:适配器模式-将不兼容的接口转换为可兼容的接口

    适配器模式(Adapter Pattern)是一种结构型设计模式,旨在将一个类的接口转换为客户端期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类能够协同工作。适配器模式通过引入一个适配器类,解决了接口不...

    设计模式 创建型模式 Prototype模式(原型)

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    设计模式:结构型-适配器模式

    适配器模式(Adapter Pattern) 是作为两个不兼容接口之间的桥梁, 这种类型的设计模式属于结构型模式。 一些书籍也称适配器模式为缺省适配器模式(Default Adapter Pattern) 。 适配器模式主要分 为三类: 类...

    Python 程序语言设计模式思路-创建型模式:工厂模式,创建对象的统一接口,封装对象的创建逻辑

    工厂模式(Factory Pattern)作为创建型模式的一种,通过提供一个统一的接口来创建对象,封装对象的创建逻辑,提高代码的灵活性和可维护性。

    《设计模式实训教程》【PPT+类图与代码+样章】

    第3章创建型模式实训 3.1知识讲解 3.1.1设计模式 3.1.2创建型模式概述 3.1.3简单工厂模式 3.1.4工厂方法模式 3.1.5抽象工厂模式 3.1.6建造者模式 3.1.7原型模式 3.1.8单例模式 3.2实训实例 3.2.1简单工厂...

    设计模式所有实验及实验报告及代码.zip

    11创建型模式的特点和分类 12单例模式 13原型模式 14工厂方法模式 15抽象工厂模式 16建造者模式 17结构型模式概述 18代理模式 19适配器模式 20桥接模式 21装饰模式 22外观模式 23享元模式 24组合模式 25行为型模式...

    c++设计模式-结构型模式-适配器模式

    c++设计模式-结构型模式-适配器模式,其他工程,c++源码。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    单片机与接口技术课程研究型教学模式研究.pdf

    单片机与接口技术课程研究型教学模式研究.pdf

    c++设计模式-行为型模式-解释器模式

    c++设计模式-行为型模式-解释器模式;qt工程;c++简单源码; 解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...

    java 23种设计模式及具体例子

    * 适配器模式:适配器模式是一种结构型模式,它可以将一个类的接口转换成另一个接口,以满足不同的要求。 * 装饰器模式:装饰器模式是一种结构型模式,它可以动态地给一个对象添加一些额外的职责。 * 代理模式:代理...

    java版本的设计模式的实现demo

    设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建;结构型模式关注类或对象的组合;行为型模式则关注类或对象之间的交互和职责分配。 2. 单例模式 单例模式是最常见的创建型...

    设计模式--C++

    3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton(单件)—对象创建型模式 84 3.6 创建型模式的讨论 89 第 4...

    设计模式 创建型模式 Builder模式(建造者)

    Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的...

    设计模式(.PDF)

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    Java设计模式.docx

    工厂模式:工厂模式是一种创建型模式,它定义了一个用于创建对象的接口,让子类决定实例化哪个类。 单例模式:单例模式是一种创建型模式,它保证一个类只有一个实例,并提供了全局访问点。 适配器模式:适配器模式是...

    设计模式可复用面向对象软件的基础.zip

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    c++设计模式-结构型模式-外观模式

    c++设计模式-结构型模式-外观模式;qt工程;c++简单源码; 外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,...

Global site tag (gtag.js) - Google Analytics