第7章:适配器与外观模式(Adapter & Facade)
一、导读
1.1 本章学习目标
第7章讲解适配器模式和外观模式——两种用于接口转换的结构型设计模式。
1.2 为什么第七章如此重要
适配器解决接口不兼容问题,外观提供简化的统一接口。两者在实际开发中非常常用。
1.3 核心问题引导
适配器模式和外观模式有什么区别?
何时使用适配器?
外观模式如何简化复杂子系统?
最小知识原则是什么?
二、核心概念详解
7.1 适配器模式
java
// 目标接口
public interface Duck {
void quack();
void fly();
}
// 被适配者
public interface Turkey {
void gobble();
void fly();
}
// 适配器
public class TurkeyAdapter implements Duck {
private Turkey turkey;
public TurkeyAdapter(Turkey turkey) { this.turkey = turkey; }
public void quack() { turkey.gobble(); }
public void fly() {
for (int i = 0; i < 5; i++) turkey.fly();
}
}
// 使用
Turkey turkey = new WildTurkey();
Duck duck = new TurkeyAdapter(turkey);
duck.quack(); // 调用 turkey.gobble()7.2 外观模式
java
// 复杂子系统
public class HomeTheaterFacade {
private Amplifier amp;
private Tuner tuner;
private DvdPlayer dvd;
private Projector projector;
private TheaterLights lights;
public void watchMovie(String movie) {
lights.dim(10);
projector.on();
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
dvd.on();
dvd.play(movie);
}
public void endMovie() {
lights.on();
projector.off();
amp.off();
dvd.stop();
dvd.eject();
}
}7.3 最小知识原则
最小知识原则(迪米特法则):
- 只与直接朋友通信
- 不与陌生人说话
- 减少类之间的耦合三、实战案例
7.1 第三方库适配
java
// 旧系统使用 Logger 接口
public interface Logger {
void log(String message);
}
// 新的日志框架
public class NewLogger {
public void info(String msg) { }
public void error(String msg) { }
}
// 适配器
public class NewLoggerAdapter implements Logger {
private NewLogger newLogger = new NewLogger();
public void log(String message) {
newLogger.info(message);
}
}四、本章小结
适配器转换接口使其兼容,外观简化复杂子系统的接口。两者都遵循最小知识原则,减少耦合。
五、思考与练习
适配器和外观有什么区别?
何时使用适配器模式?
外观模式如何简化设计?
最小知识原则如何应用?
适配器模式在框架集成中如何应用?