四种很相似的设计模式(State,Strategy,Bridge,Visitor)的区别
2012-01-14 19:36
537 查看
以上四种设计模式其实是很相似的。在我看来:
1)State模式和Strategy模式可以视为一样的模式,他们的类图之类都是一模一样的。
2)Bridge模式和Strategy模式摆在一起可能让人觉得诧异,因为前者是结构型设计模式,后者是行为型设计模式。但如果不考虑这点。他们就非常 相似了:以书中Bridge模式的例子(我记得不清楚了,只能说个大概),draw接口中的函数,有windows的实现版本,也有linux的实现版
本。这就是策略模式啊。所以我一直以为Bridge模式和Strategy模式的区别,关键在于用途不同:是否为了构件平台无关的开发基础设施,如果是就 是Bridge,否则就是Strategy,可以将Bridge视为Strategy的特例。
今天还听到一个观点,就是区别在于是1对多呢(Strategy)还是多对多(Bridge)。Bridge模式的目的是为软件构件一个平台无关的底层。 所以肯定不止一个类会使用到这个接口。有点道理,但不完全对。Strategy模式也完全可以多个类使用。所以我还是坚持我的观点,他们的差别在于模式之
外,取决于用途。
3)关于Visitor。我觉得这是一个很cool又过于花哨导致没啥用的模式哈哈。很多人没有理解对。认为遍历的时候可以OOXX,也可以XXOO就是 Visitor模式。那其实是把Visitor模式理解成Strategy模式了。Visitor的关键在于双重分发的机制。所以适用于需要用不同策略来
处理不同元素的应用场景。
举个例子,某软件有两个皮肤:man和woman,有两种图像种类:大头照和风景。man皮肤会为大头照加上胡子,在风景照中p上坦克。woman皮肤会 给大头照加上胭脂,给风景照上p上彩虹。这时候就可以使用Visitor模式了。接口Skin有两个函数void process(Picture*
pic)和void porcess(Photo* photo)。注意两个函数的名字是完全一样的,这样才能overload。gui需要对某张图像进行处理的时候,只要 skin->process(xx)就可以通过双重分发(第二重分发是overload)调用想要的处理流程了。还没完,如果这么实现 Visitor,则都必须使用具体Elem的指针/引用去调用process,这样就有点违背面向接口编程了。其实更好的做法是:Elem接口提供一个 accept(Skin* skin)函数,然后Picture/Photo类在此函数中调用skin->process(this)。则gui调用
xxx->accept(skin)也通过双重分发机制(第二重分发还是多态,采用此实现时process函数名可以不一样,因为不需要 overload)调用想要的处理流程了。
双重分发(override+overload or override+override,建议用后者),visitor模式很有特色。但能用来解决啥问题呢?貌似所有有多种Elem的地方都可以使用到该模 式。但仔细分析,除了类爆炸和华丽外,似乎Visitor模式没带来啥东西了。
ps:对Visitor的评介可能不公平不正确。只能说目前我还没见过适合使用Visitor模式的场景
1)State模式和Strategy模式可以视为一样的模式,他们的类图之类都是一模一样的。
2)Bridge模式和Strategy模式摆在一起可能让人觉得诧异,因为前者是结构型设计模式,后者是行为型设计模式。但如果不考虑这点。他们就非常 相似了:以书中Bridge模式的例子(我记得不清楚了,只能说个大概),draw接口中的函数,有windows的实现版本,也有linux的实现版
本。这就是策略模式啊。所以我一直以为Bridge模式和Strategy模式的区别,关键在于用途不同:是否为了构件平台无关的开发基础设施,如果是就 是Bridge,否则就是Strategy,可以将Bridge视为Strategy的特例。
今天还听到一个观点,就是区别在于是1对多呢(Strategy)还是多对多(Bridge)。Bridge模式的目的是为软件构件一个平台无关的底层。 所以肯定不止一个类会使用到这个接口。有点道理,但不完全对。Strategy模式也完全可以多个类使用。所以我还是坚持我的观点,他们的差别在于模式之
外,取决于用途。
3)关于Visitor。我觉得这是一个很cool又过于花哨导致没啥用的模式哈哈。很多人没有理解对。认为遍历的时候可以OOXX,也可以XXOO就是 Visitor模式。那其实是把Visitor模式理解成Strategy模式了。Visitor的关键在于双重分发的机制。所以适用于需要用不同策略来
处理不同元素的应用场景。
举个例子,某软件有两个皮肤:man和woman,有两种图像种类:大头照和风景。man皮肤会为大头照加上胡子,在风景照中p上坦克。woman皮肤会 给大头照加上胭脂,给风景照上p上彩虹。这时候就可以使用Visitor模式了。接口Skin有两个函数void process(Picture*
pic)和void porcess(Photo* photo)。注意两个函数的名字是完全一样的,这样才能overload。gui需要对某张图像进行处理的时候,只要 skin->process(xx)就可以通过双重分发(第二重分发是overload)调用想要的处理流程了。还没完,如果这么实现 Visitor,则都必须使用具体Elem的指针/引用去调用process,这样就有点违背面向接口编程了。其实更好的做法是:Elem接口提供一个 accept(Skin* skin)函数,然后Picture/Photo类在此函数中调用skin->process(this)。则gui调用
xxx->accept(skin)也通过双重分发机制(第二重分发还是多态,采用此实现时process函数名可以不一样,因为不需要 overload)调用想要的处理流程了。
双重分发(override+overload or override+override,建议用后者),visitor模式很有特色。但能用来解决啥问题呢?貌似所有有多种Elem的地方都可以使用到该模 式。但仔细分析,除了类爆炸和华丽外,似乎Visitor模式没带来啥东西了。
ps:对Visitor的评介可能不公平不正确。只能说目前我还没见过适合使用Visitor模式的场景
相关文章推荐
- 四种很相似的设计模式(State,Strategy,Bridge,Visitor)的区别
- 四种很相似的设计模式(State,Str…
- Strategy策略模式和State/Bridge模式的区别
- 生成器、桥梁、策略和状态(Builder, Bridge, Strategy and State)模式的区别
- (转)bridge 桥接模式 和 strategy模式的区别
- 各相似设计模式间的区别(不定期更新)
- 设计模式之 strategy和state
- Java设计模式 Bridge(桥接)Adapter,command,State,Mediator,Facade
- 设计模式学习笔记:看着挺像的Strategy Bridge Command
- State模式与Strategy模式的区别
- State模式与Strategy模式的区别
- 运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别
- 设计模式学习笔记--Strategy、State
- 关于相似设计模式之间的区别
- state设计模式--学习总结--state设计模式和策略设计模式的区别
- 相似设计模式的区别
- 设计模式之——桥接(Bridge)和策略(strategy)
- bridge 桥接模式 和 strategy模式的区别
- 深入浅出设计模式(九):12.装饰模式(Decorator) 13.桥模式(Bridge)14.策略模式(Strategy)
- 那些相似的设计模式的区别