单向适配器模式:
适用场合:
假设现在有两个类:
class A {public void funA() {/*A的代码*/}}
class B {public void funB() {/*B的代码*/}}
这两个模块本来没有任何关系,但是现在应用中有这样的需求:
A对象调用funA方法时,一定要同时调用B的funB方法,但不允许修改源代码(即不允许修改类A或者类B的代码)
这种场景下,可以考虑使用适配器模式。
下面的代码对应讲的是图像处理软件在原先已经清晰化处理的基础上再进行去噪声处理的例子:
package com.javaeye.kang.adapter;
/** * 单项 适配器模式 * 如果将 B 接到 A 上用(在原先 图 像清晰化的基 础 上再去噪声), A 主 动 , B 被 动 * 要点是: 继 承方法 */ class A { public void funA() { System. out .println( " 图 像清晰化! " ); } }
class B { public void funB () { System. out .println( " 图 像去噪声! " ); } }
// 对 A 进 行 扩 展,以后将 SubA 当成 A 来使用 // 在 SubA 的 funA 方法中增加 B 的 funB 方法 class SubA extends A { public void funA() { super .funA(); B b = new B(); b.funB (); } }
public class AdapterTest { public static void main(String[] args) { SubA subA = new SubA(); subA.funA(); } } |
测试结果:
图 像清晰化! 图 像去噪声! |
改进: 面向接口编程
package com.javaeye.kang.adapter;
/** * 单项 适配器模式 * 面向接口 编 程 * 如果将 B 接到 A 上用(在原先 图 像清晰化的基 础 上再去噪声), A 主 动 , B 被 动 * 要点是: 继 承方法 */
class A { public void funA() { System. out .println( " 图 像清晰化! " ); } }
// 面向接口 编 程,噪声 处 理接口 // 使用接口来管理所有的 扩 展模 块 (被 动 方模 块 可能 进 行互相切 换 ) interface YawpDispose { public abstract void yawpDispose(); }
class OldYawpDispose implements YawpDispose { public void yawpDispose() { System. out .println( " 图 像去噪声老算法! " ); } }
class NewYawpDispose implements YawpDispose { public void yawpDispose() { System. out .println( " 图 像去噪声新算法! " ); } }
// 对 A 进 行 扩 展,以后将 SubA 当成 A 来使用 // 在 SubA 的 funA 方法中增加 B 的 funB 方法 class SubA extends A { // 完全面向接口 编 程,可以将 YawpDispose 的任何 实现类对 象引 进 来(可以使用 spring 进 行 对 象注入) private YawpDispose yawpDispos ; public SubA(YawpDispose yawpDispos) { this . yawpDispos = yawpDispos; }
public void funA() { super .funA(); // 注意: 这 句代 码 可以去掉,假如去掉的 话 ,就是功能替 换 了 // (不再使用 图 像清晰化功能了,而是只是使用下面的去噪声功能了) yawpDispos .yawpDispose(); } }
// 客 户 端、最 终 使用方 public class AdapterTest { public static void main(String[] args) { // 想使用 图 像去噪声老算法就 new OldYawpDispose() ,想使用新算法就 new NewYawpDispose () // 下面 这 句 带 代 码 体 现 了多 态 ,可 扩 充性比 较 好 YawpDispose yawpDispos = new OldYawpDispose(); // 将去噪声 处 理的 对 象 传 到 SubA 对 象中去 SubA subA = new SubA(yawpDispos); subA.funA(); } } |
测试结果:
图 像清晰化! 图 像去噪声老算法! |