当前位置: 首页 > news >正文

设计模式之缺省适配模式

0.参考文献

参考1:http://tkhhappyboy.blog.163.com/blog/static/114185815201112473727410/

参考2:http://milenfan.iteye.com/blog/756060

参考3:http://java.chinaitlab.com/model/758440.html

参考4:http://www.the2ndmoon.net/weblog/?p=212

1.概述

缺省适配模式为一个接口提供缺省实现(本例中接口InterfaceA的缺省实现是AbstractClassB),这样的类型可以从这个缺省实现(AbstractClassB)进行扩展(本例中ClassBImplFun1和ClassBImplFun5都是继承AbstractClassB),而不必从原有接口进行扩展。当原接口中定义的方法太多,而其中大部分又不被需要时,这种模式非常实用。由缺省适配器类(AbstractClassB)直接实现接口(InterfaceA),并为所有方法提供缺省的空实现。用户类就只需要继承适配器类,只实现感兴趣的方法就行了。

  1. InterfaceA:目标接口。可能定义有很多方法,但这些方法不一定全都被用户类所需要。
  2. AbstractClassB:缺省适配模式的核心。它实现InterfaceA接口,为所有方法提供空的实现(也就是{}的空实现)。
  3. ClassBImplFun1:用户类,它需要实现InterfaceA接口。但因为InterfaceA方法众多,而ClassBImplFun1中对其中一两个方法(比如这里的Fun1())感兴趣。如果直接实现InterfaceA,就需要提供众多的空方法。所以它继承AbstractClassB,只需要重写它感兴趣的方法即可。既实现了InterfaceA接口,又省去了定义空方法的麻烦。

模式结构如下图所示:

结构解释

上述结构中,InterfaceA中只定义了方法,而AbstractClassB中只对方法进行空实现(就是{})。而在AImpl中对接口中定义的方法进行了具体实现。ClassBImplFun1中对AbstractClassB中的fun1()进行了重写,是具体实现;ClassBImplFun5中对AbstractClassB中的fun5()进行了重写,是具体实现。

2.代码示例

InterfaceA

View Code

AbstractClassB

View Code

ClassBImplFun1

View Code

ClassBImplFun5

View Code

AImpl

View Code

main

View Code

上述程序的运行结果是:

ClassBImplFun1调用fun1()
ClassBImplFun5调用fun5()

3.再谈Java 接口和抽象类区别

在前面的博客: Java 接口和抽象类区别中已经提到了抽象类与接口的区别,下面我们来举例说明他们之间的最大区别。
假如ClassBImplFun1中又需要新的方法fun6(),我们如果修改接口InterfaceA,在其中添加fun6()的定义,那么需要修改的地方就有AbstractClassB和AImpl这两个类,并且还得在ClassBImplFun1中给出fun6()的具体实现,这种改动是我们不希望出现的。一个非常好的方法就是在AbstractClassB中给出fun6()的具体实现,在ClassBImplFun1中就能直接调用这个方法。
具体代码:
AbstractClassB中添加如下方法:
View Code
新的Main类如下:
View Code
运行结果:

ClassBImplFun1调用fun1()
AbstractClassB调用fun6()
ClassBImplFun5调用fun5()

ps:2012-4-11

上述示例代码的类图如下图所示:


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/03/29/2424008.html,如需转载请自行联系原作者

相关文章:

  • 【Excle数据透视表】如何按照地区交替填充背景颜色
  • activeMq之hello(java)
  • 第2周第3课:chmod、chown、umask、lsattr/chattr
  • 罗森伯格成功部署印度某著名港口光纤基础设施
  • 【css】设置div位于浏览器的最底层,离用户最远
  • 经济金融领域简单数学建模和分析:MATLAB成本曲线方程和销售收入直线方程
  • 码子杂记
  • RequireJS源码分析(上)
  • 第 21 章 MySQL
  • KAFKA日志管理
  • 华为交换机常用命令
  • webmagic使用手册
  • 8.4. FAQ
  • 【R语言 评分模型】R语言建立信用评分模型
  • grails查询指定列的数据
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 10个确保微服务与容器安全的最佳实践
  • FineReport中如何实现自动滚屏效果
  • Lucene解析 - 基本概念
  • Octave 入门
  • React的组件模式
  • Yeoman_Bower_Grunt
  • 包装类对象
  • 聊聊sentinel的DegradeSlot
  • 浏览器缓存机制分析
  • 悄悄地说一个bug
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我有几个粽子,和一个故事
  • 智能合约开发环境搭建及Hello World合约
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #pragma multi_compile #pragma shader_feature
  • #pragma预处理命令
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (03)光刻——半导体电路的绘制
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)iOS字体
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core 成都线下面基会拉开序幕
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 简单实现MD5
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @JsonSerialize注解的使用
  • @selector(..)警告提示
  • [383] 赎金信 js
  • [Android 13]Input系列--获取触摸窗口
  • [Design Pattern] 工厂方法模式
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • [HDU] 1054 Strategic Game 入门树形DP
  • [HNOI2015]实验比较
  • [javaSE] 数据结构(二叉查找树-插入节点)