【面向对象设计模式】 接口型模式 (一)

简介: 【面向对象设计模式】 接口型模式 (一)

接口型模式组成 : 该模式包括适配器(Adapter)模式,外观(Facade)模式,合成(Composite)模式,桥接(Bridge)模式 四种模式;




类的接口 :


-- 前置条件 : 接口A, 类B, 类B实现接口A;


-- 允许访问 : 类A允许其它类的对象可以访问类B的 方法 与 字段, 类A 是类B的接口;


-- 实现关系 : 类B 方法需要实现 类A接口的方法名表示的操作, 类A 的实现就是 类B 中方法体的代码;




接口与实现的概念 : 接口 与 实现 二者是分离的, Java允许多个类实现同一个接口, 提供相同的功能; 也允许一个类实现多个接口;


-- 接口: 对象必须遵循的承诺;


-- 实现 : 对象如果履行承诺;






1. 接口与抽象类





接口与抽象类的区别 : 即使抽象类中全是抽象方法, 看起来与接口类似, 但是还是与接口有很大的不同;


-- 实现继承个数 : 类A 可以实现多个接口, 但是只能继承一个抽象类;


-- 抽象方法个数 : 接口中必须都是抽象方法, 抽象类中可以包含具体方法;


-- 是否使用字段 : 接口中只能创建 static final 常量字段, 抽象类中可以声明和使用任何类型字段;


-- 方法的描述符 : 接口中方法必须是public修饰, 抽象类中可以是任何限定;


-- 是否构造函数 : 接口没有构造函数, 抽象类可以有构造函数;




C语言与Java在接口方面的区别 : C语言中只有抽象类, 没有接口, Java语言中二者皆有;




接口作用 : 如果不能使用接口, 完全可以使用抽象类来代替, 接口在多层开发中发挥很大作用, 例如在J2EE中的MVC架构;




实际例子 : 火炮 和 坦克 都属于装甲车, 二者的应用场合各有不同, 但是它们有相同之处, 可以定义成接口 :


public interface Panzer {
  abstract int getSpeed();  //获取速度
  public double getCaliber(); //获取口径
  void fire();    //开火
}



从上面的例子列举接口的一些特性 :

-- 抽象方法 : 接口中的方法都是抽象方法, 不管有没有abstract声明;


-- 公开方法 : 接口中的方法都是公开方法, 不管有没有public修饰;


-- 不完全公开 : 接口中的方法在包内是公开的, 如果没有public修饰, 包内可以访问, 但是包外不能访问, 如果想要在包外访问该接口, 需要使用public修饰;


-- 接口继承: 接口A 可以 继承另一个接口B, 例如 List 接口就继承了 Collection 接口;


-- 接口不一定有方法 : 没有方法的接口可以成为标记接口, 标记接口的作用 - 一个接口处于很高的继承层次, 其方法不一定适用所有的类, 如果我们希望这个继承体系存在, 可以创建一个标记接口, 其中不定义任何方法;


-- 接口字段 : 接口中只能声明 static final 字段, 在接口实现类中可以直接调用这些字段, 其它的实例字段不能再接口中声明;


-- 接口构造函数 : 接口中不能定义构造函数, 如果定义了就会使实现类中必须实现这一特定构造函数, 不实用;






2. 接口与职责



接口的优势 : 接口限制了对象之间的交互过程, 这样的好处是即使接口的实现类发生了巨大的变化, 接口还是不会改变的, 调用接口的类仍正常运行;


-- eg : 在上面的 Panzer 实现类编写的时候, 开发者必须实现该接口的三个方法, 这是必须遵循方法制定的契约;




实现类不必实现所有方法 : 实现类可以忽略接口中某些抽象类的调用, 但是必须提供一个空的方法体, 换言之, 接口还是要实现的, 但是可以不使用;


-- 桩的概念 : stub, 桩 是接口的实现类, 实现了类中的所有的方法, 但是这些方法都没有方法体, 没有实际意义;


-- 桩的作用 : 开发者如果实现一个接口的话, 需要将所有的抽象方法都实现一遍, 写起来很麻烦, 代码也很冗余, 这里可以继承 桩 , 然后实现自己感兴趣的方法;




接口声明常量 : 接口中只能存放 static final 类型的常量, 不能声明 变量, 如果定义一个 "String str;" 就会报错;



public interface Panzer {
  public static final String TANK_1 = "KV";
  public static final String CANNON_1 = "SU-51";
  abstract int getSpeed();  //获取速度
  public double getCaliber(); //获取口径
  void fire();    //开火
}

枚举 : 通常在接口中将有分组类别的常量定义为枚举 enum;

.




3. 不同场景的接口应用



适配器模式 : 适配类的接口 以 匹配客户端期待的接口; 如 类A 实现了需求, 但是其方法名不符合接口, 这里就需要使用适配器模式;


外观模式 : 为一组类 提供一个 简单接口;


合成模式 : 为单个对象与复合对象提供统一的接口;


桥接模式 : 解除抽象与现实之间的耦合, 使二者能够独立演化;



目录
相关文章
|
设计模式 数据库连接 PHP
PHP编程中的面向对象与设计模式
在PHP编程世界中,掌握面向对象编程(OOP)和设计模式是提升代码质量和开发效率的关键。本文将深入浅出地介绍如何在PHP中应用OOP原则和设计模式,以及这些实践如何影响项目架构和维护性。通过实际案例,我们将探索如何利用这些概念来构建更健壮、可扩展的应用程序。
|
设计模式 算法 架构师
【搞懂设计模式】设计模式与面向对象原则
【搞懂设计模式】设计模式与面向对象原则
275 1
|
设计模式 存储 Java
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
JavaSE——面向对象高级二(2/4)-final关键字、常量、抽象类(认识抽象类、抽象类的好处、应用场景-模板方法设计模式)
115 0
|
设计模式 Java 编译器
Java 设计模式最佳实践:一、从面向对象到函数式编程
Java 设计模式最佳实践:一、从面向对象到函数式编程
243 0
|
设计模式 算法 关系型数据库
设计模式——设计模式简介、分类及面向对象设计原则
23 种设计模式中有些模式今天已经不流行了,有些模型已经被语言机制替代了,有些模式你可能常常会忘记,但这些都不重要,重要的是设计原则,因为有了这些设计原则,你有可能发明自己的模式,你也可以理解未来千千万万其他领域的模式。
360 1
|
设计模式 SQL 开发框架
【Java设计模式 面向对象设计思想】六 再谈MVC贫血模式与DDD领域驱动开发
【Java设计模式 面向对象设计思想】六 再谈MVC贫血模式与DDD领域驱动开发
741 1
|
设计模式 Java
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
548 0
【Java设计模式 面向对象设计思想】五 多用组合少用继承编程
|
设计模式 算法 C#
28【WinForm】C#实现商场收银软件,从面向过程到面向对象,设计模式的应用
实现商场收银系统从简单的面向过程到面向对象的演变。
362 0
|
设计模式 存储 安全
【大话设计模式】面向对象基础
【大话设计模式】面向对象基础
|
设计模式 C++
面向对象方法-大话设计模式+J2SE视频
面向对象方法-大话设计模式+J2SE视频
150 0

热门文章

最新文章