博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
6 适配器模式(Adapter)
阅读量:6716 次
发布时间:2019-06-25

本文共 2843 字,大约阅读时间需要 9 分钟。

7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源

首先来看适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看
类的适配器模式
 
  1. /** * @author liubo * */public class Source {	public void method1() {		System.out.println("thid is original method1");	}}

      

    /** * @author liubo * */public class Source {	public void method1() {		System.out.println("thid is original method1");	}}

      

    /** * @author liubo * */public class Adapter extends Source implements Targetable {	public void method2() {		System.out.println("this is the targetable method");	}}

      

    /** * @author liubo * */public class AdapterTest {	public static void main(String[] args) {		Targetable target = new Adapter();		target.method1();		target.method2();	}}

      

  1.  
  1.  
  1.  
Adapter类继承Source类,实现Targetable接口,这样Targetable接口的实现类就具有了Source类的功能
//output
thid is original method1
this is the targetable method 

对象的适配器模式

基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。看图:

 

只需要修改Adapter类的源码即可:

  1. public class Wrapper implements Targetable {  
  2.   
  3.     private Source source;  
  4.       
  5.     public Wrapper(Source source){  
  6.         super();  
  7.         this.source = source;  
  8.     }  
  9.     @Override  
  10.     public void method2() {  
  11.         System.out.println("this is the targetable method!");  
  12.     }  
  13.   
  14.     @Override  
  15.     public void method1() {  
  16.         source.method1();  
  17.     }  
  18. }  

测试类:

  1. public class AdapterTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Source source = new Source();  
  5.         Targetable target = new Wrapper(source);  
  6.         target.method1();  
  7.         target.method2();  
  8.     }  
  9. }  

输出与第一种一样,只是适配的方法不同而已。

第三种适配器模式是接口的适配器模式,接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。看一下类图:

这个很好理解,在实际开发中,我们也常会遇到这种接口中定义了太多的方法,以致于有时我们在一些实现类中并不是都需要。看代码:

  1. public interface Sourceable {  
  2.       
  3.     public void method1();  
  4.     public void method2();  
  5. }  

抽象类Wrapper2:

  1. public abstract class Wrapper2 implements Sourceable{  
  2.       
  3.     public void method1(){}  
  4.     public void method2(){}  
  5. }  
  1. public class SourceSub1 extends Wrapper2 {  
  2.     public void method1(){  
  3.         System.out.println("the sourceable interface's first Sub1!");  
  4.     }  
  5. }  
  1. public class SourceSub2 extends Wrapper2 {  
  2.     public void method2(){  
  3.         System.out.println("the sourceable interface's second Sub2!");  
  4.     }  
  5. }  
  1. public class WrapperTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Sourceable source1 = new SourceSub1();  
  5.         Sourceable source2 = new SourceSub2();  
  6.           
  7.         source1.method1();  
  8.         source1.method2();  
  9.         source2.method1();  
  10.         source2.method2();  
  11.     }  
  12. }  

测试输出:

the sourceable interface's first Sub1!

the sourceable interface's second Sub2!

达到了我们的效果!

 讲了这么多,总结一下三种适配器模式的应用场景:

类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

 
 
 

转载于:https://www.cnblogs.com/liubo6/p/4526532.html

你可能感兴趣的文章
[Windows Azure] How to Scale an Application
查看>>
RC4 in TLS is Broken: Now What?
查看>>
linux下core文件调试方法
查看>>
Tensorflow动态seq2seq使用总结(r1.3)
查看>>
ZOJ 3659 Conquer a New Region(并查集)
查看>>
艾伟:Chart Controls 简介与下载点
查看>>
【中文分词】最大熵马尔可夫模型MEMM
查看>>
CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】
查看>>
Tech Tip: Really Simple HTTP Server with Python
查看>>
Win7 在安装vs2010后向sql2008添加SQL_Server_Management详解
查看>>
hdu 4686 Arc of Dream
查看>>
通过盘古分词自定义规则功能实现软件版本号的提取
查看>>
jsoup爬取网站图片
查看>>
File Explorer下的/data/data/Package Name目录
查看>>
一、NoSQL入门概述
查看>>
JVM总结-内存监视手段及各区域内存溢出解决
查看>>
区块链技术未来注定将改变我们的生活!
查看>>
vGPU 7.X新特性解读,NVIDIA为何力推虚拟GPU?
查看>>
简单的区块链开发入门:Hyperledger Iroha介绍
查看>>
苏宁双十一超燃庆功趴刷爆朋友圈,网友:想去苏宁当员工!
查看>>