Adapter模式-适配器模式的一个完整例子
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]