用内部类实现适配器模式的核心是将非核心接口实现封装为私有内部类,对外提供精简接口,既解耦又隐藏细节;可结合抽象适配器减少冗余重写,或用匿名内部类快速完成一次性适配,且内部类能直接访问外部类私有成员。

用内部类实现适配器模式,核心是把“不属核心职能”的接口实现收进外部类内部,对外只暴露精简接口,既解耦又隐藏细节。
用私有内部类封装非核心接口实现
当一个类需要响应监听器、回调或事件接口,但这些行为不属于它的主职责时,不要让外部类直接实现该接口(会污染类职责),而是定义私有内部类来承担:
- 内部类实现完整接口,但仅在外部类内可见;
- 外部类提供简洁方法(如 addListener())接收接口类型参数,实际传入的是内部类实例;
- 客户代码无法 new 出该内部类,也无法访问其具体字段或非接口方法。
结合抽象适配器减少冗余重写
若接口方法较多(如 MouseListener 有 5 个方法),而你只关心其中 1–2 个,可配合抽象适配器使用:
- 定义 abstract class MouseListenerAdapter implements MouseListener,空实现所有方法;
- 在外部类中声明私有内部类继承该适配器,只重写真正需要的方法;
- 通过公有方法返回该内部类实例,调用方拿到的是接口引用,完全不知底层结构。
匿名内部类快速完成一次性适配
对简单、单次使用的适配逻辑,直接用匿名内部类更轻量:
- 在调用处写 new MouseListenerAdapter() { public void onClick() { ... } };
- 编译后生成独立类文件(如 Outer$1.class),但源码中无类名、不可复用、不可继承;
- 天然隐藏实现,且避免为一次行为单独建类,适合 UI 事件、定时任务等场景。
关键点:外围类引用与私有数据访问
内部类能自然访问外部类的私有字段和方法,这使得适配逻辑可直接操作主业务状态,无需暴露 setter 或 public 成员:
- 比如 TalkingClock 的私有 beep 字段,可在内部类 TimePrinter 中直接使用;
- 客户调用 start() 启动监听,却完全不知道铃声开关变量的存在;
- 这种访问不是靠 getter/setter,而是编译器自动注入的隐式外围类引用,安全且高效。










