设计模式之缺省适配模式

简介:

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,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
21 0
|
2月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
49 0
|
26天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
6天前
|
设计模式 前端开发 Java
19:Web开发模式与MVC设计模式-Java Web
19:Web开发模式与MVC设计模式-Java Web
16 4
|
10天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
27 2
|
14天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
14天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
16天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
14 0
|
26天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
1月前
|
设计模式 Java
23种设计模式,工厂方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】工厂方法模式是设计模式中的一种创建型模式,它主要解决的问题是对象创建的问题。它定义了一个创建对象的接口,但让实现这个接口的类来决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。
27 3