适配器设计模式

适配器设计模式

 定义:
将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.

为何使用?
我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办?

使用Adapter,在这两种接口之间创建一个混合接口(混血儿).

如何使用?
实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).

对象适配器

demo源代码

package demo01;

public class RoundPeg {
 public void insertIntoHole(String msg) {
  System.out.println("RoundPeg insertIntoHole():" + msg);
 }

}

 

package demo01;

/**
 * 假设我们要打桩,有两种类:方形桩 圆形桩.
 * @author Administrator
 *
 */
public class SquarePeg{
  public void insert(String str){
   System.out.println("SquarePeg insert():"+str);
  }

 }

package demo01;

/**
 * 现在有一个应用,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.
 * 假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:
 *
 * @author Administrator
 *
 */
public class PegAdapter extends SquarePeg {

 private RoundPeg roundPeg;

 public PegAdapter(RoundPeg peg) {
  this.roundPeg = peg;
 }

 public void insert(String str) {
  roundPeg.insertIntoHole(str);
 }

}

// 在上面代码中,RoundPeg属于Adaptee,是被适配者.PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.
// 实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.
//
// PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,
// 再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,
// 前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.
//
// 如果你有些Java使用的经验,已经发现,这种模式经常使用。

 

类适配器

package demo02;

public interface  IRoundPeg {

 public void insertIntoHole(String msg);

}

package demo02;

public interface  ISquarePeg {
 public void insert(String str);

}

package demo02;

public class RoundPeg implements IRoundPeg   {
 public void insertIntoHole(String msg) {
  System.out.println("RoundPeg insertIntoHole():" + msg);
 }

}

package demo02;

/**
 * 假设我们要打桩,有两种类:方形桩 圆形桩.
 * @author Administrator
 *
 */
public class SquarePeg  implements ISquarePeg  {
  public void insert(String str){
   System.out.println("SquarePeg insert():"+str);
  }

 }

 

package demo02;

//下面是新的PegAdapter,叫做two-way adapter:

public class PegAdapter implements IRoundPeg, ISquarePeg {

 private RoundPeg roundPeg;
 private SquarePeg squarePeg;

 // 构造方法
 public PegAdapter(RoundPeg peg) {
  this.roundPeg = peg;
 }

 // 构造方法
 public PegAdapter(SquarePeg peg) {
  this.squarePeg = peg;
 }

 public void insert(String str) {
  roundPeg.insertIntoHole(str);
 }

 @Override
 public void insertIntoHole(String msg) {
  // TODO Auto-generated method stub
  squarePeg.insert(msg);
 }

}

// 还有一种叫Pluggable
// Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。

 

package demo02;

/**
 * 测试方法
 * @author Administrator
 *
 */
public class Test {

 public static void main(String[] args) {

  SquarePeg squarePeg = new SquarePeg();
  PegAdapter pad = new PegAdapter(squarePeg);

  pad.insertIntoHole("墨镜安排");

  RoundPeg roundPeg = new RoundPeg();
  PegAdapter pad2 = new PegAdapter(roundPeg);
  pad2.insert("晚上好");
 }
}

 

 

 

你可能感兴趣的:(适配器设计模式)