页数:16页文件大小:194.0 KB来源: 设计模式ppt课件
本课件继续结构型设计模式,对比只用组合或只用继承的不足,进而说明装饰模式层层扩展职责、代理模式控制对象访问以及享元模式共享细粒度对象的做法与效果。
3.5装饰模式(Decorator Pattern)1.改变Dog的Eat实现,怎么办?(两种方式)2.若只是希望给Dog的Eat扩展一些功能呢?1中的方法会有哪些不足呢?
只使用组合的不足:1.NewDog与Animal不再有父子关系(即使NewDog组合Animal也一样)。2.Client需要修改。
只使用继承的不足:1.当Eat和Sleep同时变化,有多种组合时,子类数量激增。2.只能改变单个类的功能,例如这里只能改变Dog的,不能改变Tiger的。3.不能统一改变全部类型的功能。如不能同时改变Tiger和Dog的Eat。
共同使用组合和继承:
更一般化的:
3.5.2结构
3.5.3装饰着模式效果优点:1.保持抽象层上关系的稳定;2.比单独使用组合或继承灵活;3.随时扩展功能或职责;不足:1.可能产生许多更小的子类;2.Component类过大时,效率较低,此时可考虑使用策略模式
3.5.4例子现在希望扩展所有Shape的Draw功能:即:处理原来正常的绘制外,还要在各自Shape的外边画各自的边框,Circle外边画一个菱形框,Triangle外边画一个矩形框。
3.6代理模式当事人律师法院在A对象访问B对象时,为B对象提供一个中介(代理)Proxy,使得A对象不再直接访问B对象,而是直接访问Proxy,由Proxy自行决定是否与B对象交互。这样就可以控制对B对象的访问。
例:
3.6.2代理模式结构
| 代理种类 | 作用 |
|---|---|
| 远程代理(Remote Proxy) | 隐藏目标对象的位置信息 |
| 虚拟代理(Virtual Proxy) | 隐藏具体的访问过程及实现细节 |
| 保护代理(Protection Proxy) | 保证访问的安全性 |
| 智能指针(Smart Pointer) | 在访问时自动管理对象的释放 |
class SmartPtr{public:SmartPtr (A *p): ptr(p) { }~ SmartPtr( ) { delete ptr; }A* operator->( ) { return prt;}// other operationsprivate:SmartPtr(const SmartPtr&);SmartPtr& operator=(constSmartPtr&);private:A *ptr;// other data};main() {SmartPtr pt(new A);pt->f( );}对比:main() {A * pt = new A;pt->f( );delete pt;}3.7享元模式
字符图像(例)
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}