当我们建立了一个类后,我们可能需要为其添加一些功能,而这些功能又往往会是多个这样的类都需要的。如果我们仍然使用传统的建立子类的方法,必然导致许多代码被一次次的重复书写,而且即使在我们完成这些类后,很难对其进行修改。
既然新建子类的方法太过死板,我们就考虑是否可以将这些新的功能“摘”出来,变成一个个零件,当我们需要他的时候便将其加在我们的类上,这样之后我们如果需要改变功能,也只需要改变零件,不需要对我们的类重写。
这样我们就想到了装饰器模式。适配器模式的关键就是通过一个抽象类,实现我们所要添加功能的接口,同时在这个抽象类的构造方法中引入一个具体实现所需要的类的参数,最后通过一个子类实现抽象类,为其添加方法。
举例来讲,我们想建立一个动物类的接口,使用兔子类和乌龟类实现他,兔子和乌龟都拥有移动的属性,但兔子跑得快,我们想通过适配器模式为兔子添加快的属性,这样当我们换成与猎豹比较时,就可以再将这个快的属性赋予猎豹。
首先我们建立动物接口
public interface animal{
public void move{...}
然后是兔子与乌龟类:
public class rabbit implements animal{
@override
public void move(){
...//兔子的跑法
}
}
public class tortoise implements animal{
@override
public void move(){
...//乌龟的跑法
}
}
接着建立适配器类
public abstract class animalDecorator implements animal{
protected animal speed;
public animalDecorator(animal speed){
this.speed = speed;
}
public void move(){
speed.move();
}
最后实现适配器类:
public class fastMove implements animal{
public fastMove(animal speed){
super(speed);
}
@Override
public void move(){
speed.move();
...//跑的快的功能
}
当我们需要一个跑的快的兔子时,我们就可以使用适配器声明这个变量:
animalDecorator fastRabbit = new fastMove(new rabbit());
fastRabbit.move();
这样当我们使用move方法时,就不只有兔子move的方式,还有快的属性。