适配器:
1将B看起来更像A,本质还是B
2适配器要做的工作和目的接口大小成正比
3可以将一个适配器包装多个适配者(外观模式)
4定义:将一个或者多个类的接口转换成客户期望的另外一个接口。解决客户不兼容的问题,让客户从实现接口中解耦
5
适合场景:
1当系统有新的接口,又要考虑旧有接口时候
原理
对象适配器
好处:适配者的子类都可以搭配适配器使用
1使用组合,有弹性
类适配器
优点:不需要重复实现被适配者
对象适配案例
//target
public interface Duck {
//叫的行为
public void quack();
//飞行行为
public void fly();
}
//野鸭具体类
public class MallardDuck implements Duck {
public void quack() {
System.out.println("野鸭叫");
}
public void fly() {
System.out.println("野鸭飞");
}
}
//adaptee
public interface Turkey {
//火鸡的叫行为
public void gobble();
//火鸡的飞行行为
public void fly();
}
//火鸡具体类
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("火鸡叫");
}
public void fly() {
System.out.println("火鸡飞");
}
}
//Adapter
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
turkey.fly();
}
}
测试
public static void main(String[] args) {
//鸭子具体类
MallardDuck mallardDuck = new MallardDuck();
//火鸡具体类
WildTurkey wildTurkey = new WildTurkey();
//火鸡适配器,让火鸡看起来像鸭子
Duck duck = new TurkeyAdapter(wildTurkey);
System.out.println("\n火鸡的行为:---------");
wildTurkey.gobble();
wildTurkey.fly();
System.out.println("\n鸭子行为---------");
testDuck(mallardDuck);
System.out.println("\n披着鸭子外套的火鸡:---------");
testDuck(duck);
}
static void testDuck(Duck duck){
duck.fly();
duck.quack();
}
结果:
火鸡的行为:---------
火鸡叫
火鸡飞
鸭子行为---------
野鸭叫
野鸭飞
披着鸭子外套的火鸡:---------
火鸡叫
火鸡飞
装饰模式和适配器区别
适配器
隐身幕后
转换接口
客户是被解耦的
装饰模式
添扩展新的责任或者行为
复杂,不清楚这个装饰接口被其他装饰者包装了多少次