public interface Duck {
public void quack();
public void fly();
}public class MallardDuck implements Duck {
//很简单的实现:只是打印出鸭子在干什么
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I‘m flying");
}
}public interface Turkey {
//火鸡不会呱呱叫,只会咕咕(gobble)叫
public void gobble();
//火鸡会飞,虽然飞不远
public void fly();
}public class WildTurkey implements Turkey {
//简单打印火鸡的动作说明
public void gobble() {
System.out.println("Gobble gobble");
}
public void fly() {
System.out.println("I‘m flying a short distance");
}
}public class TurkeyAdapter implements Duck {
//首先,你需要实现转成的类型接口,也就是你的客户所期望看到的接口
//接着,需要取得要适配的对象引用,这里我们利用构造器取得这个引用
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
//现在我们需要实现接口中的方法。
//quack()在类之间转换很简单,只要调用gobble()就可以了
public void quack() {
turkey.gobble();
}
/*
* 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞翔。
* 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()方法来完成。
* @see headfirst.adapter.ducks.Duck#fly()
*/
public void fly() {
for(int i=0; i < 5; i++) {
turkey.fly();
}
}
}public class DuckTestDrive {
public static void main(String[] args) {
/*
* 创建一只鸭子和一只火鸡
* 然后将火鸡包装进一个火鸡适配器中,使它看起来像是一只鸭子
*/
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
//测试这只火鸡
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
//测试这只鸭子
System.out.println("\nThe Duck says...");
testDuck(duck);
//重要的测试来了:我们试着传入一个假装是鸭子的火鸡
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}public class EnumerationIterator implements Iterator {
/*
* 因为我们将枚举适配成迭代器,适配器需要实现迭代器接口,适配器必须看起来就像是一个迭代器
* 我们利用组合的方式,将枚举结合进入适配器中,所以用一个实例变量记录枚举
*/
Enumeration enumeration;
public EnumerationIterator(Enumeration enumeration) {
this.enumeration = enumeration;
}
//迭代器的hasNext()方法其实是委托给枚举的hasMoreElements()方法
public boolean hasNext() {
return enumeration.hasMoreElements();
}
//next()委托给nextElements()方法
public Object next() {
return enumeration.nextElement();
}
//很不幸,我们不能支持迭代器的remove()方法,所以必须放弃,我们的做法是抛出一个异常
public void remove() {
throw new UnsupportedOperationException();
}
} public void watchMovie(String movie) {
/*
* watchMovie()将我们之前手动进行的每项任务依次处理。请注意,每项任务都是
* 委托子系统中相应的组件处理的。
*/
System.out.println("Get ready to watch a movie...");
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);
dvd.on();
dvd.play(movie);
}设计模式笔记07-适配器模式与外观模式,布布扣,bubuko.com
原文:http://blog.csdn.net/adoaiwen1314/article/details/23739155