Adapter模式-适配器模式的一个完整例子

作者: ldsea 分类: 程序生活 发布时间: 2008-06-18 10:47

Adapter模式-适配器模式的一个完整例子
1.首先定义一个IShape接口

[code]/**
* 定义一个"形状"的接口
* @author ldsea
*
*/
public interface IShape {
  public void setPosition(int position);
  public int getPositon();
  public void move();
  public void display();
}[/code]

2.定义一个矩形类,实现这个接口

[code]/**
* 一个矩形类,实现IShape接口,实现接口中定义的4个方法
* @author ldsea
*
*/
public class Square implements IShape{

  int position;
  @Override
  public int getPositon() {
    // TODO Auto-generated method stub
    return position;
  }

  @Override
  public void move() {
    // TODO Auto-generated method stub
    System.out.println("The Square's position has been move to  "+2*position);
  }

  @Override
  public void setPosition(int position) {
    // TODO Auto-generated method stub
    this.position=position;
  }

  @Override
  public void display() {
    // TODO Auto-generated method stub
    System.out.println("The Square's position is:"+position);
  }
  
}[/code]

3.现在想定义一个圆形类,Circle类,发现目前已经存在一个Circle类,假设该类不允许我们修改,或者说该类已经被项目中的其他类所集成或引用,如果修改的话,会引起其他程序的错误。该Circle类如下:

[code]/**
* 想再创建一个圆类,现在已经存在一个Circle类,但是它没有实现IShape接口,该类
* 里的方法是我们需要的部分方法,没有实现Move方法,按照Adapter模式原则,不应修改此类,应该创建一个适配器类
* @author ldsea
*
*/
public class Circle {
  int position;
  public void setPosition(int position){
    this.position=position;
  }
  public int getPosition(){
    return position;
  }
  public void display(){
    System.out.println("The Circle's postion is:"+position);
  }
}[/code]

如上所示,该Circle类没有实现ISape,而且没有move的方法,那么我们需要创建一个适配器类来完成这个工作,而不用重新写一个Circle类
4.定义一个CircleAdapter适配器类

[code]/**
* Circle的适配器类,实现IShape接口,重用Circle类的方法
* @author ldsea
*
*/
public class CircleAdapter implements IShape{

  private Circle circle;

  public CircleAdapter(){
    circle = new Circle();
  }
  @Override
  public void display() {
    // TODO Auto-generated method stub
    circle.display();
  }

  @Override
  public int getPositon() {
    // TODO Auto-generated method stub
    return circle.getPosition();
  }

  @Override
  //为Circle扩展Move()的方法
  public void move() {
    // TODO Auto-generated method stub
    System.out.println("The Circle's position has been move to  "+2*getPositon());
  }

  @Override
  public void setPosition(int position) {
    // TODO Auto-generated method stub
    circle.setPosition(position);
  }

}[/code]

5.下面写一个测试类来测试这些类

[code]/**
* 该Apapter模式的Test类
* @author ldsea
*
*/
public class TestApapter {

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Square square = new Square();
    square.setPosition(100);
    square.display();
    square.move();
    CircleAdapter circle = new CircleAdapter();
    circle.setPosition(1000);
    circle.display();
    circle.move();
  }

}[/code]

6.输出结果如下:

[code]The Square's position is:100
The Square's position has been move to  200
The Circle's postion is:1000
The Circle's position has been move to  2000[/code]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注