设计模式学习笔记(2)-适配器模式
Adapter的模式的作用主要是调整某个类的接口,使其适应于现有架构。
实现要点:
1.定义一个适配类,实现需要适配成的接口(或者继承现有的类)。
2.在适配类中持有一个被适配对象,在适配接口中调用适配对象的方法。
1 public class Switch { 2 Switchable switchDevice; 3 public void setSwitchDevice(Switchable switchDevice) { 4 this.switchDevice = switchDevice; 5 } 6 public void checked() { 7 switchDevice.turnOn(); 8 } 9 10 public void unChecked() { 11 switchDevice.turnOff(); 12 } 13 } 14 public interface Switchable { 15 void turnOn(); 16 void turnOff(); 17 } 18 public class Light implements Switchable{ 19 private String name; 20 public Light(String name) { 21 this.name = name; 22 } 23 public void turnOn() { 24 System.out.println("turn on light = " + name); 25 } 26 public void turnOff() { 27 System.out.println("turn off light = " + name); 28 } 29 } 30 public class Fan { 31 private int id; 32 public Fan(int id) { 33 this.id = id; 34 } 35 public void open() { 36 System.out.println("open id = " + id); 37 } 38 39 public void close() { 40 System.out.println("close id = " + id); 41 } 42 } 43 44 45 public class FanAdapter implements Switchable { 46 private Fan fan; 47 48 public FanAdapter(int id) { 49 fan = new Fan(id); 50 } 51 52 @Override 53 public void turnOn() { 54 fan.open(); 55 56 } 57 58 @Override 59 public void turnOff() { 60 fan.close(); 61 } 62 } 63 64 public class Test { 65 public static void main(String[] args) { 66 Switch lightSwitch = new Switch(); 67 lightSwitch.setSwitchDevice(new Light("reading lamp")); 68 lightSwitch.checked(); 69 lightSwitch.unChecked(); 70 71 Switch fanSwitch = new Switch(); 72 fanSwitch.setSwitchDevice(new FanAdapter(226)); 73 fanSwitch.checked(); 74 fanSwitch.unChecked(); 75 76 } 77 78 }
在上面的例子中,假设 Switch 和 Switchable 及 Light是现有的类, 而Fan是第三方提供的一种设备的代码。可以看到Fan的方法和现有设计接口不同,假设没有办法直接修改Fan的代码。因此创建了FanAdapter去将Fan的接口适配成我们需要的接口,这样就可以避免修改我们现有的设计。