转载请注明出处:http://blog.csdn.net/droyon/article/details/8744722
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
这个模式可以让我们通过创建适配器进行接口转换,让不兼容的接口变成兼容。这个模式让客户端从实现中解耦。
当你需要使用一个现有的类而其接口并不符合你的要求时,就使用适配器。
适配器模式将对象包装起来,改变其接口。装饰着模式将一个对象包装起来,增加其新行为和责任。
案例情景:
四只小花猫参加唱歌比赛,比赛要求五个人,他们只有四只,他们把小花狗忽悠进来了,可小花狗不会sing,看看适配器如何帮助他们。
1、Cat.java
public interface Cat {
public void sing();
}
2、SmaillFlowerCat.java
public class SmaillFlowerCat implements Cat{
private String name;
public SmaillFlowerCat(String name){
this.name = name;
}
@Override
public void sing() {
System.out.println(name+"--喵~");
}
}
3、Dog.java
public class Dog {
public void bake(){
System.out.println("汪汪~");
}
}
4、CatAdapter.java
public class CatAdapter implements Cat{
private Dog mDog;
public CatAdapter(Dog dog){
mDog = dog;
}
@Override
public void sing() {
mDog.bake();
}
}
5、Test.java
import java.util.ArrayList;
public class Test {
public static void main(String args[]){
ArrayList<Cat> catArrayList = new ArrayList<Cat>();
Dog dog =new Dog();
for(int i=0;i<4;i++){
SmaillFlowerCat cat = new SmaillFlowerCat("小花猫"+(i+1)+"号");
catArrayList.add(cat);
}
Cat dogToCat = new CatAdapter(dog);
catArrayList.add(dogToCat);
for(Cat c:catArrayList){
c.sing();
}
}
}
测试结果:
小花猫1号--喵~
小花猫2号--喵~
小花猫3号--喵~
小花猫4号--喵~
汪汪~
我们通过CatAdapter将小狗的bake方法,适配成了sing方法,sing方法是兼容的方法。
优点:
被适配者的任何子类都可以搭配着适配器使用。
我们的Dog类,不需要做任何改变,Dog类是真正被解耦的。
总结:适配器需要分清谁是被适配者。我们的适配器需要组合被适配者,继承目标对象的接口,在接口实现中,调用被适配者的方法。