第四部分 结构模式
第二十二章 适配器模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。
它同时也叫做变压器模式和包装模式。
适配器的两种形式
适配器模式有类的适配器模式和对象的是撇弃模式。如下图,左边的是类适配器模式,右边的是对象适配器模式。
类的适配器模式的结构
类的适配器模式把被适配的类的API转换成目标类的API,结构图如下:
在上图中可以看出,Adaptee类并没有sampleOperation2()方法,而客户端要这个方法,为使客户端能够使用Adaptee类,提供一个中间环节,即类Adapter,把Adaptee的API与Target类的API衔接起来。Adapter和Adaptee是继承关系,这就决定了适配器的模式是类的。
代码如下:
Target的源代码:
package com.javapatterns.adapter.classAdapter;
public interface Target {
void sampleOperation1();
void sampleOperation2();
}
Adaptee的源代码:
package com.javapatterns.adapter.classAdapter;
public class Adaptee {
public void sampleOperation1(){}
}
Adapter源代码:
package com.javapatterns.adapter.classAdapter;
public class Adapter extends Adaptee implements Target {
public void sampleOperation2(){
// Write your code here
}
}
个人理解:就是Adaptee这个源角色的方法不够用了,此时就用接口Target来补充,最后使用子类Adapter来实现。
类的适配器模式的结构:
使用一个具体类把源(Adaptee)适配到目标(Target)中,这样一来,如果源以及源的子类都使用此类适配,就行不通了。
由于适配器时源的子类,因此可以在适配器类中置换掉源的一些方法。
由于只引进了一个适配器类,因此只有一个路线到达目标类,使问题得到简化。
对象的适配器模式的结构
结构图如下:
直接上代码:
Target源代码:
package com.javapatterns.adapter.objectAdapter;
public interface Target {
void sampleOperation1();
void sampleOperation2();
}
Adaptee(需要扩展功能的类)源代码:
package com.javapatterns.adapter.objectAdapter;
public class Adaptee {
public void sampleOperation1(){}
}
Adapter(扩展后的类)源代码:
package com.javapatterns.adapter.objectAdapter;
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
super();
this.adaptee = adaptee;
}
public void sampleOperation1(){
adaptee.sampleOperation1();
}
public void sampleOperation2(){
// Write your code here
}
}
总结:
读者不要误以为适配器模式就是为了补充源角色没有的方法而准备的!
对象适配器模式的效果:
1.一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以以源类和它的子类都适配到目标接口。
2.与类的适配器模式相比,要想置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只要先做一个源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源进行适配。
3.虽然要想置换源类的方法不容易,但是要想增加一些新的方法则方便得很,而且增加的方法可同时适用于所有的源。
在什么情况下使用适配器模式
1.系统需要使用现有的类,而此类的接口不符合系统的要求。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象的适配器模式而言)在设计里,需要改变多个已有的子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器类,而这不符合实际。
第二十三章 缺省适配模式
直接给出一个鲁智深的例子图:
其中天英星这个抽象类便是一个适配器类。它把鲁智深不需要实现的方法,采用了空的实现,所以鲁智深就不用再去实现这些方法了。
- 大小: 3.2 KB
- 大小: 11.3 KB
- 大小: 10.7 KB
- 大小: 10.9 KB
分享到:
相关推荐
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
我们并不认为这组设计模式是完整的和一成不变的,它只是我们目前对设计的思考的记录。因此我们欢迎广大读者的批评与指正,无论从书中采用的实例、参考,还是我们遗漏的已知应用,或应该包含的设计模式等方面。你...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是软件工程领域中一个极为重要的概念,它代表着一系列被广泛接受的解决特定问题的方法。GoF(Gang of Four)所提出的23种设计模式更是...
设计模式的学习和应用分为几个阶段:首先自己学会设计模式,然后将其转化为自己的语言表达出来,接着是教授他人并最终记录下来。这种学习路径要求学习者不仅要理解设计模式本身,还要具备清晰的表达能力和深刻的理解...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它为解决特定问题提供了一套标准的解决方案。《设计模式精解——GoF 23种设计模式解析及C++实现源码...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 ##### 0.1 设计模式解析(总序) 设计模式是面向对象编程中用于解决常见问题的一系列模板。它们为软件设计提供了标准化的解决方案,帮助...
本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 ...
最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...
1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
### 设计模式精解—GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式作为一种重要的面向对象设计工具,在软件开发中扮演着至关重要的角色。本文旨在深入解析GoF(Gang of Four,四人组)提出的23种设计...
在ThinkPHP3.1框架中,最重要的是其MVC(Model-View-Controller)设计模式的实现,这种模式将应用程序的业务逻辑、数据和界面展示分离开来,提高了代码的可维护性和复用性。MVC模式下,模型负责处理数据,视图负责...