适配器模式-Adapter
将一个不兼容接口的对象包装起来,变成兼容的对象
外观/门面模式-Facade
将一群对象包装起来,以简化接口
当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式
外观将客户从一个复杂的子系统中解耦
实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行
可以为一个子系统实现一个以上的外观
装饰模式-Decorator
将一个对象包装起来以增加新的行为和责任
===============================================================
适配器模式示例
让火鸡变鸭子,以兼容现有接口的参数类型
鸭子的接口
package adapter.duck;
public interface Duck {
public void quack();
public void fly();
}
具体的鸭子
package adapter.duck;
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I'm flying");
}
}
火鸡的接口
package adapter.turkey;
public interface Turkey {
public void gobble();
public void fly();
}
具体的火鸡
package adapter.turkey;
public class WildTurkey implements Turkey {
@Override
public void gobble() {
System.out.println("Gobble");
}
@Override
public void fly() {
System.out.println("I'm flying a short distance");
}
}
将火鸡伪装成鸭子
package adapter.turkey;
import adapter.duck.Duck;
/**
* 适配器
* 内部将火鸡伪装为鸭子
*/
public class TurkeyAdapter implements Duck {
//被适配者
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
/**
* 委托被组合的对象完成任务
*/
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for(int i=0;i<5;i++) {
//火鸡需要连续飞行5次才能抵上鸭子飞行一次
turkey.fly();
}
}
}
测试:让火鸡也兼容以鸭子类型作为参数的接口
package test;
import adapter.duck.Duck;
import adapter.duck.MallardDuck;
import adapter.turkey.Turkey;
import adapter.turkey.TurkeyAdapter;
import adapter.turkey.WildTurkey;
public class AdapterTest {
public static void main(String[] args) {
Duck duck = new MallardDuck();
Turkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says:");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck syas:");
testDuck(duck);
System.out.println("\nThe TurkeyAdapter syas:");
testDuck(turkeyAdapter);//通过适配器,让火鸡变为鸭子去了
}
private static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
===============================================================
Enumeration适配器