适配器模式(变压器模式)

为什么要 用适配器模式。就是把两个完全不关联或者不相同的类纠合一起时才使用这个模式。

这个模式涉及到角色:
源角色:需要适配的角色。
目标角色:期待使用的接口。
适配器角色:把源角色转化成目标角色。这个是模式的核心。着重转化功能。

适配器模式分两种情况:
类的适配器模式和对象的适配器模式 。

首先来讲讲类的适配器模式:

如下例:

指方为圆的故事。

//方形接口

public interface Square{

   //方形具有画方形的功能

  public void drawSquare();

   //是否是图形

  public boolean isGraphical();

}

这里主要是想用目标接口。。但是又要能提供画方形功能。此时目标接口如下

//圆形接口 即目标接口

public interface Circular{

  //具有画方形的功能

  public void drawCircular();

 

//是否都是图形

  public boolean isGraphical();

}
                                                                                                                                                                       

为了能使圆形接口能使用画方形功能。则适配器角色产生。适配器角色作用就是能够提供目标角色不具有的源角色功能。

接口如下

public class CircularAdator implements Circular,Square{

   public void drawSquare(){

       System.out.println("我是方形接口的功能 我画方形");

  }

  public void drawCircular(){

        System.out.println("我是圆形接口的功能。我画圆形");

  }

 //方形和圆形都有此功能。

 public boolean isGraphical(){

        return true;

 }

类适配模式。比较简单。。而且只能适合单一的类。子类和多个类都都无法重用这个适配器。如果要适配分别要针对每个子类进行适配。这样维类就会越来越臃肿。而且也不可取。

对象适配器。主要使用聚合/组合原则进行的适配。通过对上面的接口改造如下。

//被适配的接口 方形接口 拥有画方形的能力

 public  interface Square{

    //画方形图画的能力

    public void drawSquare();

     //是否是图形 指的是形状

    public boolean isGraphical();

 }

//圆形接口,目标接口 我们需要的接口

public interface Circulare{

   //拥有画圆形的能力

   public void drawCirculare();

   

  //同样是图形

   public void isGraphical();

}

//具体被适配的接口的实现类。。这里也可以直接适配

public class SquareAdaptee implements Square{

  //具有画方形的能力

  public void drawSquare(){

       System.out.println("我是方形图形噢。。")

  }

 public boolean isGraphical(){

       return true;

  }

}

//圆形适配器类,是我们的目标类,实现圆形接口,本身拥有画圆形的能力之外。同时需要提供方形的能力

public class CirculareAdaptor implements Circulare{

  //组合方形接口,适配

  private Square squareAdaptee;

 //构造子

  public CirculareAdaptor(Square squareAdaptee){

    this.squareAdaptee =squareAdaptee;

 }

   public void drawCirculare(){

           System.out.println("我具有画圆形的能力噢");

  }

   //是图形 

  public boolean isGraphical(){

    return true;

  }

//委托方形去画。圆形不具有画方形的功能

public void drawSquare(){

  squareAdaptee.drawSquare();

 }

}

针对对象适配器模式。因为是使用了组合和聚合原则。源接口(被适配的类)的子类都适用这个适配器类,不需要增加具体子类的适配器类。从而减轻了类的维护成本。

缺省适配器类。

 如果源和目标接口为同一个类。又由于我们不需要源类所有方法。我们提供源类的平庸实现。后续子类继承时。我们有选择我们需要的功能方法。

 例省略。

应用场景:

 1,我们需要的目标的角色功能。但是源口接口没没有的

2,当源接口无法修改时。我们需要适配角色来达到我们需要的接口的目的。

猜你喜欢

转载自chendw-hz.iteye.com/blog/1155337
今日推荐