Strategy模式和Template模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算
法)具体实现和抽象接口之间的解耦。Strategy模式将逻辑(算法)封装到一个类(Context)
里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的
实现委托给组合对象实现。State模式也有类似的功能,他们之间的区别将在讨论中给出。
可以看到Strategy模式和Template模式解决了类似的问题,也正如在Template模式中分析
的,Strategy模式和Template模式实际是实现一个抽象接口的两种方式:继承和组合之间的区
别。要实现一个抽象接口,继承是一种方式:我们将抽象接口声明在基类中,将具体的实现放
在具体子类中。组合(委托)是另外一种方式:我们将接口的实现放在被组合对象中,将抽象
接口放在组合类中。这两种方式各有优缺点,先列出来:
1) 继承:
优点
a)易于修改和扩展那些被复用的实现。
缺点
a)破坏了封装性,继承中父类的实现细节暴露给子类了;
b)“白盒”复用,原因在a)中;
c)当父类的实现更改时,其所有子类将不得不随之改变
d)从父类继承而来的实现在运行期间不能改变(编译期间就已经确定了)。
2) 组合
优点
a)“黑盒”复用,因为被包含对象的内部细节对外是不可见的;
b)封装性好,原因为a);
c)实现和抽象的依赖性很小(组合对象和被组合对象之间的依赖性小);
d)可以在运行期间动态定义实现(通过一个指向相同类型的指针,典型的是抽象基类
的指针)。
缺点
a)系统中对象过多。
从上面对比中我们可以看出,组合相比继承可以取得更好的效果,因此在面向对象的设计
中的有一条很重要的原则就是:优先使用(对象)组合,而非(类)继承(Favor Composition
Over Inheritance)。
实际上,继承是一种强制性很强的方式,因此也使得基类和具体子类之间的耦合性很强。
例如在Template模式中在ConcreteClass1中定义的原语操作别的类是不能够直接复用(除非你
继承自AbstractClass,具体分析请参看Template模式文档)。而组合(委托)的方式则有很小
的耦合性,实现(具体实现)和接口(抽象接口)之间的依赖性很小,例如在本实现中,
ConcreteStrategyA的具体实现操作很容易被别的类复用,例如我们要定义另一个Context类
AnotherContext,只要组合一个指向Strategy的指针就可以很容易地复用ConcreteStrategyA的
实现了。
我们在Bridge模式的问题和Bridge模式的分析中,正是说明了继承和组合之间的区别。请
参看相应模式解析。
另外Strategy模式很State模式也有相似之处,但是State模式注重的对象在不同的状态下
不同的操作。两者之间的区别就是State模式中具体实现类中有一个指向Context的引用,而
Strategy模式则没有。具体分析请参看相应的State模式分析中。
没有合适的资源?快使用搜索试试~ 我知道了~
设计模式C++Code版
共253个文件
cpp:65个
h:41个
plg:24个
需积分: 6 90 下载量 96 浏览量
2007-08-15
14:29:10
上传
评论
收藏 212KB RAR 举报
温馨提示
设计模式C++Code版
资源推荐
资源详情
资源评论
收起资源包目录
设计模式C++Code版 (253个子文件)
Director.asp 249B
main.asp 0B
AbstractionImp.asp 0B
main.asp 0B
Handle.cpp 1KB
Observer.cpp 1KB
Colleage.cpp 1KB
State.cpp 1KB
Mediator.cpp 952B
Interpret.cpp 906B
Memento.cpp 883B
Template.cpp 833B
Decorator.cpp 807B
Visitor.cpp 803B
Subject.cpp 800B
Builder.cpp 741B
AbstractionImp.cpp 733B
AbstractFactory.cpp 731B
Flyweight.cpp 725B
Composite.cpp 696B
Strategy.cpp 679B
Element.cpp 647B
main.cpp 645B
Product.cpp 632B
FlyweightFactory.cpp 632B
Facade.cpp 616B
Iterator.cpp 593B
Aggregate.cpp 582B
main.cpp 518B
main.cpp 508B
Prototype.cpp 504B
Proxy.cpp 500B
Adapter.cpp 471B
main.cpp 464B
Adapter.cpp 439B
Context.cpp 433B
main.cpp 433B
main.cpp 409B
main.cpp 395B
main.cpp 389B
main.cpp 385B
Abstraction.cpp 385B
main.cpp 375B
Factory.cpp 363B
main.cpp 355B
Command.cpp 348B
main.cpp 341B
Product.cpp 334B
main.cpp 323B
Singleton.cpp 309B
Invoker.cpp 303B
Director.cpp 286B
Context.cpp 277B
main.cpp 271B
main.cpp 270B
main.cpp 268B
main.cpp 265B
Component.cpp 264B
Product.cpp 259B
main.cpp 250B
main.cpp 226B
main.cpp 225B
main.cpp 223B
Reciever.cpp 212B
main.cpp 195B
main.cpp 193B
main.cpp 188B
Leaf.cpp 180B
Context.cpp 90B
Composite.dsp 5KB
Builder.dsp 5KB
Command.dsp 5KB
AbstrcatFactory.dsp 5KB
Interpreter.dsp 5KB
Flyweight.dsp 5KB
ChainOfResponsibility.dsp 5KB
Iterator.dsp 5KB
Mediator.dsp 5KB
Strategy.dsp 5KB
Observer.dsp 5KB
Bridge.dsp 5KB
Factory.dsp 4KB
Visitor.dsp 4KB
State.dsp 4KB
prjTemplate.dsp 4KB
Prototype.dsp 4KB
Singleton.dsp 4KB
Decorator.dsp 4KB
Adapter.dsp 4KB
Adapter.dsp 4KB
Memento.dsp 4KB
Facade.dsp 4KB
Proxy.dsp 4KB
ChainOfResponsibility.dsw 567B
AbstrcatFactory.dsw 555B
prjTemplate.dsw 547B
Interpreter.dsw 547B
Prototype.dsw 543B
Singleton.dsw 543B
Flyweight.dsw 543B
共 253 条
- 1
- 2
- 3
资源评论
Ejnstein
- 粉丝: 569
- 资源: 28
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功