适配器模式(Adapter)
- 适配器(adapter-pattern):将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。两种形式:
- 对象适配器(组合)
- 类适配器(多重继承):在Java中不能实现
- 外观(facade-pattern):提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
- 原则
最少知识原则:只和你的密友谈话
- 要点:
- 当需要使用一个现有的类而其接口不符合需要时,使用适配器。适配器改变接口以符合客户期望。
- 当需要简化并统一一个很大的接口或一群复杂的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。
- 适配器与装饰者的区别:适配器将一个对象包装起来以改变接口;装饰者将一个对象包装起来以增加新的行为和责任;而外观将一群对象“包装”起来以简化接口。
鸭子—火鸡转换器
1 // 鸭子 2 public interface Duck { 3 public void quack(); 4 public void fly(); 5 } 6 7 // 绿头鸭是鸭子的子类,实现了鸭子的呱呱叫和飞行的能力 8 public class MallardDuck implements Duck{ 9 @Override 10 public void quack() { 11 System.out.println("Quack"); 12 } 13 14 @Override 15 public void fly() { 16 System.out.println("I‘m flying"); 17 } 18 } 19 20 // 火鸡 21 public interface Turkey { 22 // 火鸡不会呱呱叫,只会咯咯叫 23 public void gobble(); 24 25 public void fly(); 26 } 27 28 // 野生火鸡 29 public class WildTurkey implements Turkey{ 30 @Override 31 public void gobble() { 32 System.out.println("Gobble gobble"); 33 } 34 35 @Override 36 public void fly() { 37 System.out.println("I‘m flying a short distance"); 38 } 39 } 40 41 // 首先,你需要实现想转换成的类型接口,也就是你的客户期望看到的接口 42 public class TurkeyAdapter implements Duck { 43 Turkey turkey; 44 45 // 接着,需要取得要适配的对象引用,这里我们引用构造器取得这个引用 46 public TurkeyAdapter(Turkey turkey) { 47 this.turkey = turkey; 48 } 49 50 // 现在我们需要实现接口中所有的方法。quack()在类之间的转换很简单, 51 // 只要调用gobble()接可以了 52 @Override 53 public void quack() { 54 turkey.gobble(); 55 } 56 57 // 固然两个接口都具备了fly()方法,火鸡的飞行距离很短,不像鸭子可以长途飞行。 58 // 要让鸭子的飞行和火鸡的飞行能够对应,必须连续五次调用火鸡的fly()来完成 59 @Override 60 public void fly() { 61 for (int i = 0; i < 5; i++) { 62 turkey.fly(); 63 } 64 } 65 }
Client:
1 public class DuckTestDrive { 2 public static void main(String[] args) { 3 MallardDuck Duck = new MallardDuck(); 4 WildTurkey turkey = new WildTurkey(); 5 Duck turkeyAdapter = new TurkeyAdapter(turkey); // generate a turkey-like duck 6 turkeyAdapter.fly(); 7 turkeyAdapter.quack(); 8 } 9 }
枚举器—迭代器适配器
旧的枚举器(Enumeration),新的迭代器(Iterator)
1 public class EnumerationIterator implements Iterator { 2 Enumeration enum; 3 public EnumerationIterator(Enumeration enum){ 4 this.enum = enum; 5 } 6 public boolean hasNext(){ 7 return enum.hasMoreElements(); 8 } 9 public Object next(){ 10 return enum.nextElement(); 11 } 12 public void remove(){ 13 throw new UnsupportedOperationException();//不能支持迭代器remove方法,因为枚举器没有该方法,抛出异常 14 } 15 }
外观模式
时间: 2024-11-03 21:54:31