Java设计模式之适配器模式(Adapter)

转载:《JAVA与模式》之适配器模式

这个总结的挺好的,为了加深印象,我自己再尝试总结一下

1.定义:

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

     (太官方了,不太好理解,

其实就是要用到两个不相关的类/接口,但是又没有源代码,或者不想修改源代码,而增加一个类来完成合并使用的目的)

2.实现这个目的有两个方法,继承或者组合

2.1.使用继承(就是所谓的类适配器模式)

2.2.使用组合(所谓的对象适配器模式)



案例: 公司招员工,要求会讲中、英、法、日四国语言,同时还很会编程的员工。

招聘要求类 JobNeedSkill 接口:

1 package design.pattern.adapter2;
2
3 public interface JobNeedSkill {
4     void speakChinese();
5     void speakEnglish();
6     void speakJapanese();
7     void speakFrench();
8     void goodCoding();
9 }

而这里有个工人,技术超一流,可惜只会说中文。

Worker类:

 1 package design.pattern.adapter2;
 2
 3 public class Worker {
 4     public void goodCoding(){
 5         System.out.println("我编程也挺牛的哦");
 6     }
 7
 8     public void speakChinese(){
 9         System.out.println("我只会说中文呢,能不能请我啊");
10     }
11 }

招聘测试类 Test:

 1 package design.pattern.adapter2;
 2
 3 public class Test {
 4     //招聘员工
 5     public static void hireWorker(JobNeedSkill worker){
 6         System.out .println("恭喜你,你被录用了,展示一下你的技能吧");
 7
 8         System.out .println("===============================");
 9         worker.speakChinese();
10         worker.speakEnglish();
11         worker.speakFrench();
12         worker.speakJapanese();
13         worker.goodCoding();
14     }
15
16     public static void main(String[] args){
17         //我是个只会说中文的工人 ,但我编程好
18         Worker me = new Worker();
19
20         //我们需要一个会说四国语言的员工
21 //        hireWorker(me);//直接招聘是不行了,再给他配个步步高点读机吧
22
23         /*
24          * 以上代码为初始状态,后面的代码是后面根据需求增加的
25          * */
26
27         //有步步高点读机,这是使用了继承的方式,类的适配模式
28         TheManHasBuBuGao bbg = new TheManHasBuBuGao();
29         hireWorker(bbg);
30
31         System.out.println("*****************\r\n");
32         //这个自带助理的,是使用了组合的方式,是对象的适配模式
33         WorkerHasAssistant gfs = new WorkerHasAssistant(me);
34         hireWorker(gfs);
35     }
36
37 }

很明显,一开始的时候发现,尽管这个人技术很牛,但是只会说中文这一点,实在让人觉得可惜,

别说我们公司不能招聘了,就连eclipse都提示错误了:

不过他的技术的确非常符合我们公司的需要,怎么办呢,咋取舍呢······

如果,如果他有一台 “步步高点读机呢”

TheManHasBuBuGao类:

 1 package design.pattern.adapter2;
 2 //这里使用了继承的方式
 3 public class TheManHasBuBuGao extends Worker implements JobNeedSkill{
 4
 5     @Override
 6     public void speakJapanese() {
 7         System.out.println("妈妈再也不用担心我的日语了");
 8     }
 9
10     @Override
11     public void speakFrench() {
12         System.out.println("哪里不会就点哪里,这样法语也随便搞定了");
13     }
14
15     @Override
16     public void speakEnglish() {
17         System.out.println("So Easy.");
18     }
19
20 }

这样问题就解决了,步步高点读机就是好!

不过他说他没有步步高点读机,但是他有一个贴身翻译助理

WorkerHasAssistant类:

 1 package design.pattern.adapter2;
 2
 3 public class WorkerHasAssistant implements JobNeedSkill{
 4     //这个人有自己的助理翻译,这里是使用了组合的方式
 5     private Worker worker;
 6
 7     //在构造方法中传进来
 8     public WorkerHasAssistant(Worker worker){
 9         this.worker = worker;
10     }
11
12     @Override
13     public void goodCoding() {
14         worker.goodCoding();
15     }
16     @Override
17     public void speakChinese() {
18         //worker会说,直接用worker
19         worker.speakChinese();
20     }
21
22     @Override
23     public void speakEnglish() {
24         //英语他不会说,这就要助手出马翻译了
25         System.out.println("我是他的翻译,他说 Hello World.");
26     }
27
28     @Override
29     public void speakJapanese() {
30         //日语他也不会说,这还是要助手出马翻译了
31         System.out.println("八嘎");
32     }
33
34     @Override
35     public void speakFrench() {
36         //每错,他英语也不行
37         System.out.println("He can say English too.");
38     }
39
40
41 }

最后运行的效果是:

  把文章看完是个好习惯,

在最后还要特别说明一下,适配器模式还有一种默认缺省的用法,这个目的跟上面的略微不同,但做法是一致的,

都是增加了一个适配类,哈哈(别跟别的设计模式搞混了哦,同时这种用法在Swing开发里经常用到)

Skill 接口:

1 package design.pattern.adapter2;
2
3 public interface Skill {
4     void sing();
5     void dance();
6     void fly();
7     void cry();
8     //.......一大堆方法
9 }

如果 Person类直接实现 Skill接口,就会变成这样:

 1 package design.pattern.adapter2;
 2
 3 public class Person implements Skill{
 4
 5     @Override
 6     public void sing() {
 7         // TODO Auto-generated method stub
 8
 9     }
10
11     @Override
12     public void dance() {
13         // TODO Auto-generated method stub
14
15     }
16
17     @Override
18     public void fly() {
19         // TODO Auto-generated method stub
20
21     }
22
23     @Override
24     public void cry() {
25         // TODO Auto-generated method stub
26
27     }
28
29 }

必须同时实现Skill接口中的所有方法,但其实我们关注的只是其中某一个方法而已,

所以,这时候就可以增加一个中间类SkillAdapter,这个类也实现了Skill接口,并实现了所有方法,不过是空实现:

 1 package design.pattern.adapter2;
 2
 3 public class SkillAdapter implements Skill{
 4
 5     @Override
 6     public void sing() {
 7         // TODO Auto-generated method stub
 8
 9     }
10
11     @Override
12     public void dance() {
13         // TODO Auto-generated method stub
14
15     }
16
17     @Override
18     public void fly() {
19         // TODO Auto-generated method stub
20
21     }
22
23     @Override
24     public void cry() {
25         // TODO Auto-generated method stub
26
27     }
28
29 }

而我们在继承这个中间类(Adapter),再重写我们所关注的方法就可以了,而无需做过多无谓的操作:

1 package design.pattern.adapter2;
2
3 public class NewPerson extends SkillAdapter{
4     public void sing(){
5         System.out.println("我只会唱歌,别的我都不会了");
6     }
7 }

最后再总结一下:

因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构(也就是去改代码),

除了这种默认缺省的适配器外,前面的例子都是在没办法情况下的办法而已。

时间: 2024-12-14 04:49:42

Java设计模式之适配器模式(Adapter)的相关文章

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter.由于Class Adapter的实现需要用到多继承,而Java不支持多继承,所以这里只关注Object Adapter. 在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用.那么如果我们需要维护一些年代比较久远的代码,可能就会面临着没

java设计模式之六适配器模式(Adapter)

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模式,先看类图: 核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码: [java] view plaincopy public class Source { public void 

如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

如何让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 概念相关 定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 简单点说: 两个彼此间没有太大关联的类,想进行交互完成某些事情,如果 直接去修改各自的接口,就显得有些繁琐了,可以加个中间类, 用它来协调两类之间的关系,完成相关业务.这种玩法就叫适配器模式! 两种适配器模式: 根据适配器类与适配者类的关系不同,适配器模式可分为 类适配器 和 对

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

Java设计模式----初识适配器模式

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3930271.html 联系方式:[email protected] [正文] 我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟

二十四种设计模式:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 示例有一个Message实体类,某个类对它的操作有Insert()和Get()方法.现在需要把这个类转到另一个接口,分别对应Add()和Select()方法. MessageModel using System; using System.Collections.Generic; using System.Text; name

浅谈JAVA设计模式之——适配器模式(Adapter)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45457903 一.概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,而它的接口不符合你的需求. 2.你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口 可能不一定兼容的类)协同工作. 3.(仅适用于对象Adapter)你想使用一些已经存

Java设计模式应用——适配器模式

性能监控系统中,存在告警模块和报表模块,告警结果和报表结果都需要导出. 由于告警开发进度较快,已经实现了excel导出.csv导出.zip导出功能,现在报表需要excel导出.csv导出.pdf导出功能,该如何做呢? 显然,报表不会重复开发excel导出,csv导出代码,只需要增加pdf导出代码即可,这种情况下使用适配器模式再好不过. 一. 类适配器模式 直接的想法,继承告警导出类,增加pdf导出代码,这也就是类适配器模式. 1. 告警导出类 package com.coshaho.learn.