- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计模式_Adapter
设计模式之--- 适配器模式(结构型) Adapter(适配器)模式 Adapter(适配器) 类/对象结构型模式 意图 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 即我们需要一种方法,为一个内容合适但接口不匹配的对象创建一个新的接口。 指定Shape对象将提供的特定行为。为了这个目的,我在Shape类中为这些行为定义了接口,然后在每个派生类中实现相应的行为。 Shape类需要的行为如下: 设定一个Shape对象的位置 获取一个Shape对象的位置 显示一个Shape对象 填充一个Shape对象 设置一个Shape对象的颜色 擦除一个Shape对象 新的任务:现在客户要求实现一个圆--一种新的Shape(需求总是会变化的)。为了完成这个任务,将创建一个新的类--Circle类--来实现“圆”这个形状,并从Shape类中派生出Circle类,这样仍然可以获得多态行为。 问题:现在,面临的任务是必须为Circle类编写display、fill、undisplay这三个方法。这是一件很费力的任务。 幸运的事情:在我四处搜寻替代品之下,我发现有人已经编写了一个名叫XXCircle的类来处理圆形的相关问题。很不幸,这个类的方法命名为: displayIt fillIt undisplayIt 我不能直接使用XXCircle类,因为那样就无法保持Shape类的多态行为。原因有两个: XXcircle类中的方法名称和参数列表都和Shape类不同。 无法派生它--不但方法名必须相同,这个类还必须派生自Shape类。 不可能改变XXCircle的方法名称或从Shape类派生XXCircle类。因为这将需要修改所有使用XXCircle类的其他对象。而且,如果修改别人的代码,我担心会产生无法预料的副作用。 我几乎得到想要的东西了,但我不能使用它,我也不想重写它。我该怎么办? 我可以创建一个派生自Shape类的新类,从而实现Shape接口而不必重写XXCircle类中的圆形的实现代码: Circle类派生自Shape类。 Circle对象包含XXCircle对象 Circle对象将收到的请求转发给内部的XXCircle对象。 使用Adapter模式让我可以继续对Shape类使用多态。换句话说,Shape的客户对象不知道Shape的对象真正代表的形状类型。 Adapter模式最通常的用途就是保持多态。 C++代码段:实现Adapter模式 Class Circle:public Shape{ … Private: XXCircle *pxc; … Circle::Circle(){ pxc=new XXCircle; } void public Circle::display(){ pxc-displayIt(); } } 结构型模式 Adapter(类适配器) 关键特征 * * 案例:客户对象只是简单的告诉一个点、线或正方形对象做一些事,比如“显示自己”或“擦除自己”。每个点、线、正方形都有责任知道如何根据自己的类型做出相应的行为。 circle XXcircle shape 这是客户所期待的接口。 需要适配的类 通过在内部包装一个adaptee对象,将源接口转换为目标接口
文档评论(0)