guokehua(@yahoo.com.cn oy Java! 39设计模式(2) 1010 郭克华J2EE框架实战教学视频
oy Java! J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 39设计模式(2)
guokehua(@yahoo.com.cn 回顾 ●前面我们讲过几种创建模式: Factory, Builder, Singleton ●今天我们讲解结构模式 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 回顾 z前面我们讲过几种创建模式: Factory,Builder,Singleton z今天我们讲解结构模式
guokehua(@yahoo.com.cn 适配器模式( adapter 场景:有两个类: O Class a{ public void funA({/*A代码*/}} O Class b{ public void funB0{B代码*}} 这两个模块本来没有任何关系,但是应用中需要 凡是以后A的对象调用了funA方法,一定要同时 调用B的funB方法,怎么办?不能改变源代码 ●这个问题的类比:贵公司开发了一套图像应用软 件,其中一个功能是可以把图像进行清晰化。但 是这套软件运行一段时间之后,大家发现将图片 清晰化之后然后进行一下去噪声可能会更好。于 是贵公司又开发了一个专门去噪声的类,现在问 题来了,怎样把这个去噪声的类接到你原来的软 件上?不改变源代码。 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 适配器模式(adapter) z 场景:有两个类: { Class A{ public void funA(){/*A代码*/ } } { Class B{ public void funB(){/*B代码*/} } z 这两个模块本来没有任何关系,但是应用中需要 凡是以后A的对象调用了funA方法,一定要同时 调用B的funB方法,怎么办?不能改变源代码 z 这个问题的类比:贵公司开发了一套图像应用软 件,其中一个功能是可以把图像进行清晰化。但 是这套软件运行一段时间之后,大家发现将图片 清晰化之后然后进行一下去噪声可能会更好。于 是贵公司又开发了一个专门去噪声的类,现在问 题来了,怎样把这个去噪声的类接到你原来的软 件上?不改变源代码
guokehua(@yahoo.com.cn 单向适配器模式要点 注意:分清主动和被动方,主动方称为 Adaptor,被动方称为 Adaptee 定义一个类 SubAdapto,继承 Adaptor类,重 写fnA方法 ●在这个类的构造函数可以传入 Adapter的引 用 ●在 SubAdaptorl的funA里面调用 Adaptee的funB 函数 ●将 SubAdaptor当成 Adaptor来使用 Adaptor a=new SubAdaptor(new Adapteeo) 种更好的办法:用接口, spring管理 Adaptee 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 单向适配器模式要点 z 注意:分清主动和被动方,主动方称为 Adaptor,被动方称为Adaptee z 定义一个类SubAdaptor,继承Adaptor 类,重 写funA方法 z 在这个类的构造函数可以传入Adaptee的引 用 z 在SubAdaptor的funA里面调用Adaptee的funB 函数 z 将SubAdaptor当成Adaptor来使用 z Adaptor a = new SubAdaptor(new Adaptee()); z 一种更好的办法:用接口,spring管理Adaptee
guokehua(@yahoo.com.cn 更进一步的适配器 场景:有两个类: lass Af O public void funAlO{*A代码*} O public void funA20{A2代码*/} ON O class Bi O public void funB1O{*B1代码*/} O public void funB20{*B2代码*} 应用需要凡是以后A的对象调用了funA1方法, 定要同时调用B的funB1方法;B的对象调用了 funB2方法,一定要同时调用A的fnA2方法;怎 么办?不能改变源代码 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 更进一步的适配器 z 场景:有两个类: { class A{ { public void funA1(){/*A1代码*/} { public void funA2(){/*A2代码*/} { } { class B{ { public void funB1(){/*B1代码*/} { public void funB2(){/*B2代码*/} { } z 应用需要凡是以后A的对象调用了funA1方法,一 定要同时调用B的funB1方法; B的对象调用了 funB2方法,一定要同时调用A的funA2方法;怎 么办?不能改变源代码
guokehua(@yahoo.com.cn 双向 Adapter要点 ●因为不允许多重继承,用接口将两个类 以及相关方法管理起来 ●编写第三个类,在构造函数传入前两个 类的引用,并实现接口,重写函数 在函数里面进行调用 ●第三个类既可以当A,又可以当B来使用 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 双向Adapter要点 z因为不允许多重继承,用接口将两个类 以及相关方法管理起来 z编写第三个类,在构造函数传入前两个 类的引用,并实现接口,重写函数 z在函数里面进行调用 z第三个类既可以当A,又可以当B来使用
guokehua(@yahoo.com.cn 适配器模式练习 练习有一个 Frame1,上有一个按钮,点击 按钮能让 Frame变红;另外有一个 Frame2, 上有一个按钮,点击能将其标题改为 China ●现在要求:这两个 Frame在开发的时候并不 知道将要调用外界的类,将这两个类合起 来,达到:点击 Frame1内的按钮,出现 Frame2,能将 frame2的标题改为 China,点 击 frame2内的按钮,将 Frame变红。不改 变 Frame,2的源代码 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 适配器模式练习 z 练习:有一个Frame1,上有一个按钮,点击 按钮能让Frame1变红;另外有一个Frame2, 上有一个按钮,点击能将其标题改为China。 z 现在要求:这两个Frame在开发的时候并不 知道将要调用外界的类,将这两个类合起 来,达到:点击Frame1内的按钮,出现 Frame2,能将Frame2的标题改为China,点 击Frame2内的按钮,将Frame1变红。不改 变Frame1,2的源代码
guokehua(@yahoo.com.cn Adapter适配器小结 把一个类的接口变换成客户端所 期待的另一种接口,从而使原本 因接口原因不匹配而无法一起工 作的两个类能够一起工作。适配 类可以根据参数返还一个合适的 实例给客户端。 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 Adapter -适配器小结 z把一个类的接口变换成客户端所 期待的另一种接口,从而使原本 因接口原因不匹配而无法一起工 作的两个类能够一起工作。适配 类可以根据参数返还一个合适的 实例给客户端
guokehua(@yahoo.com.cn Decorator(装饰)模式 场景:贵公司编写了一个类 Readstr fromfile,专门负责从文件内读取 字符串。本来这个功能已经足够了。但是 后来发现这些字符串还需要统一变成大写 字母。请你编写一个类,能够将字符串转 大写字母,并配合上面的类使用,你有何 高见? ●方案1:在主函数内,编写一个类,调用 ReadStrFrom file,得到字符串,转大写。 ●方案2(适配器模式):扩展 ReadStrfrom file,重写读文件函数 ●评价方案2! 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 Decorator(装饰)模式 z 场景:贵公司编写了一个类 ReadStrFromFile,专门负责从文件内读取 字符串。本来这个功能已经足够了。但是 后来发现这些字符串还需要统一变成大写 字母。请你编写一个类,能够将字符串转 大写字母,并配合上面的类使用,你有何 高见? z 方案1:在主函数内,编写一个类,调用 ReadStrFromFile ,得到字符串,转大写。 z 方案2(适配器模式):扩展 ReadStrFromFile ,重写读文件函数 z 评价方案2 !
guokehua(@yahoo.com.cn 和适配器的区别 C A A C B B 适配器 装饰 A模块可能要B为他服 C模块可能为A服务, 务,也可能要C为他服 也可能为B服务 务 郭克华J2EE框架实战教学视频
J guokehua@yahoo.com.cn 郭克华J2EE框架实战教学视频 和适配器的区别 A B C A B C 适配器 A模块可能要B为他服 务,也可能要C为他服 务 装饰 C模块可能为A服务, 也可能为B服务