zoukankan      html  css  js  c++  java
  • java设计模式学习5--Adapter Pattern[原创]

      昨天写了点适配器模式的心得,由于写得不怎么清楚,索性删掉。
      今天停了一天的电,白天根本写不了东西,唉~~
      晚上来电了,开始写东西。  

      上次写了建造模式,现在再来看看适配器模式。
      先说变压器(Adapter),变压器把一种电压变换成另一种电压。再看个成语,“移花接木”。  我们经常碰到要将一个类的接口转换成客户希望的另外一个接口,即让一个类里的某方法体现出另一个类里某方法产生的效果,或者是增加一个类的方法到另外一个类里。第一解决方案是:修改或增加类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改接口。 怎么办?
      这个时候就要用到适配器了。
      先看看下面的图:
      

    对象的适配器(Adapter)模式

    类的适配器(Adapter)模式
      

      总的说来,就是客户访问Target的request( )方法,希望得到Adaptee中的specialRequest( )方法。
      Adapter继承Target,因此客户可以访问Adapter了,在Adapter中,怎么得到specialRequest( )方法呢?
      Adapter要得到Adaptee中的( )pecialRequest方法,可以有2种方式:
      1.Adapter中没有specialRequest方法,它只是个中转站,它转而访问Adaptee得到specialRequest。
      2.Adapter中存在specialRequest方法。
      方法1中的,就是组合方式,而方法2则是继承方式。
      第一种方法,是对象的适配器,第二种是类的适配器。
      先说对象的适配器,看看下面的代码:
      public class Adapter extends Target
      {
       private Adaptee adaptee;
       public Adapter(Adaptee adaptee)
       {
        super( );
                    this.adaptee=adaptee;
       }
       public void request( )
          {
        adptee.specialRequest( );
       }
           }
      Adapter 继承了Target,并重载了Target的request方法,使得结果得到specialRequest方法,满足了要求。
      这个时候,Adapter叫做对象适配器,我们可以这么想,Adapter起的不是介绍对象的作用么?
      一个对象适配器可以把多种不同的Adaptee适配到同一个目标(同一个适配器可以把源类和它的子类都适配到目标接口)。
      对象适配器允许Target和Adaptee完全无关,只有Adapter知道二者的存在。
      下面来说说类适配器。
      对象适配器只继承了Target,但是,同样Adapter也可以继承Adaptee。由于java不允许多继承,所以要用到接口。
      现在,我们把Adaptee变成继承一个接口,Adapter也继承同个接口,这样在Adapter中就存在specialRequest方法了,客户就可以直接访问Adapter.specialRequest( )了,
      public interface IAdaptee {
       public void specialRequest( );
       ……
      }

      public class Adaptee implements IAdaptee {
       public void Adaptee ( ) {
        //......
       }
       public void specialRequest( ){
         //......
       }
       }

            public class Adapter extends Target implements IAdaptee {

       private Adaptee adptee;
       public Adapter(Adaptee adptee) {
         this.adptee=adptee;
       }
       public void specialRequest( ) {
         adptee.specialRequest( );
       }
      }

      在这种情况下,如果Target和Adaptee有一个相同名字的方法,Adapter不能保证这两个方法具有相同的含义或者行为,它不知道到底该用哪个方法,这是非常危险的,要注意。

      我认为,适配器的功能只需要做到转换作用,我看到网上有什么在适配器里置换源类的方法什么的,有必要放适配器里吗?还看得人一楞一楞的,真是伤脑筋。

  • 相关阅读:
    分布式事务的解决方案
    普通平衡树(bzoj 3224)
    [学习笔记] 树链剖分
    矩阵树定理——矩阵树不是树
    哈夫曼树
    SDOI2018一轮NOI培训 题目整理
    Luogu P1119 灾后重建
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑(转)
    单点登录的设计与实现
    PHP如何进阶,提升自己
  • 原文地址:https://www.cnblogs.com/zxub/p/178629.html
Copyright © 2011-2022 走看看