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