`
xuyuanshuaaa
  • 浏览: 393802 次
  • 性别: 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模式。
分享到:
评论

相关推荐

    DHCP配置全局模式与接口模式

    DHCP配置全局模式与接口模式 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种应用层协议,用于将IP地址和其他相关参数分配给网络设备。DHCP配置模式有两种:全局模式和接口模式。本文将详细...

    设计模式1,FACADE模式,Adapter

    首先,FACADE(外观)模式是一种接口型模式,它的主要作用是为复杂的子系统提供一个简单的接口,使得客户端无需了解子系统内部的复杂性。通过创建一个外观类,对外暴露统一的操作,隐藏子系统组件间的交互细节。这样...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    设计模式,软件开发

    #### 接口型模式——适配器模式解析 设计模式是在软件工程领域内,针对特定问题的一种通用解决方案。它们提供了一种标准化的方式来处理常见的编程难题,使代码更加灵活、可重用和易于理解。在众多设计模式中,...

    设计模式PPT

    - **接口型模式**:如外观模式、适配器模式、组合模式和桥接模式,它们关注对象间的接口集成和通信。 - **责任型模式**:如单例模式、观察者模式、中介者模式、代理模式和职责链模式,这些模式主要处理对象间的职责...

    java 设计模式

    ### Java设计模式之接口型模式总结 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,为解决常见问题提供了模板。本文将深入探讨Java设计模式中的四大接口型模式——适配器模式(Adapter)、...

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

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

    设计模式之结构型模式

    在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...

    S7-200 SMART如何将485接口由自由口模式切换成PPI模式?.docx

    老款的S7-200系列PLC可以通过拨码开关切换到STOP模式来恢复PPI模式,但S7-200 SMART的紧凑型CRs CPU(如CR20s、CR30s、CR40s和CR60s)没有这样的硬件开关,且没有以太网接口,因此切换方式有所不同。 将485接口从...

    行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读

    在给定的标题和描述中,我们关注的是三种主要的设计模式类别:行为型模式、结构型模式和创建型模式。下面将分别对这三大类模式进行详细阐述,并通过实例剖析它们的核心概念和应用场景。 **行为型模式**主要关注对象...

    (结构型模式)Bridge模式

    Bridge模式是一种设计模式,属于结构型模式之一,其主要目的是将抽象部分与实现部分分离,使得两者可以独立地进行变化。这种模式的核心思想是“抽象不应该依赖于具体,而应该依赖于抽象”。Bridge模式通过引入一个...

    设计模式之结构型模式uml类图EA文件.rar

    在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...

    结构型模式的几个模式

    根据它们的功能,这些模式通常被分为三类:创建型模式、结构型模式和行为型模式。本篇文章将重点讨论结构型模式中的几种关键类型:外观模式、代理模式、适配器模式以及桥接模式。 #### 二、结构型模式简介 结构型...

    Java设计模式之结构型模式源码以及文档

    今天我们要探讨的是“Java设计模式之结构型模式”。结构型模式主要关注如何组织类和对象,以达到良好的架构,提升代码的可读性和可维护性。在这个主题中,我们将深入理解并讨论这些模式的原理、应用场景及其实现。 ...

    JAVA设计模式,常用创建型、结构型、行为型模式介绍和代码示例

    ### JAVA设计模式详解:创建型、结构型、行为型模式介绍及代码示例 #### 一、概述 在软件开发过程中,设计模式提供了一系列解决常见问题的模板,帮助开发者更高效地编写高质量代码。设计模式通常被划分为三种类型...

    C#面向对象设计模式纵横谈-创建型模式

    虽然不是严格意义上的创建型模式,但组合模式与创建型模式密切相关,因为它允许我们构建树形结构的对象。它将简单对象和组合对象以一致的方式处理,使客户端代码可以透明地操作单个元素或整个对象结构。 以上创建...

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    标题中的“C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)”明确了文章的主题聚焦于C#语言环境下的设计模式探讨,具体到第9篇讨论的是“Composite组合模式”。这一模式属于结构型模式的一种,旨在解决...

    Bridge 桥接模式(结构型模式)

    视频资源“7.Bridge 桥接模式(结构型模式).wmv”可能涵盖了以下内容: 1. 桥接模式的概念解释和基本结构。 2. 桥接模式的UML类图展示,解释各个角色之间的关系。 3. 实例演示,如图形界面库的设计,其中颜色和形状是...

Global site tag (gtag.js) - Google Analytics