一.模板方法和策略模式
模板方法:定义一个操作算法的骨架,而将这一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
策略模式:定义一系列的算法,把他们一个个给封装起来,并且使他们可以互相替换.
二者区别是:这里的模板的操作算法和策略的模式的算法都是指泛义上的算法,可以简单的理解为具体实现。
模板方法替换算法的方法最直接,就是继承覆盖,一看就懂。当然模板方法的重点是定义这些算法的结构;模板方法用继承来实现算法的替换;而策略模式采用的是组合复用。一者为垂直的继承实现关系, 二者为水平的包含依赖;
二.策略模式和状态模式
https://www.cnblogs.com/m7777/p/7723879.html
策略模式与状态模式在实现上有共同之处,都是把不同的情形抽象为统一的接口来实现。2个模式的UML建模图基本相似,区别在于:
状态模式需要在子类实现与context相关的一个状态行为。状态模式的的思想是,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B。状态模式是不停的切换状态执行。
策略模式的思想上是,考虑多种不同的业务规则将不同的算法封装起来,便于调用者选择调用。策略模式只是条件选择执行一次。
个人认为:策略模式抽象的多是方法(行为:将方法抽象为对象,不同的实现达到同一个目标:比如不同的压缩算法,都是为压缩,春运时不同的交通工具选择,都是为回家 等等);而状态模式,重点是抽象状态,即字段数据;不同状态下,即使同一个方法也会有不同的结果;所以,状态模式下,通常状态对象和环境对象会彼此引用,环境对象会将自己的行为委托给状态对象,状态对象内部行为会涉及到状态的流转变化;
三:策略模式和命令模式
https://www.cnblogs.com/cg88/p/9480143.html
策略模式 把易于变化的行为分别封装起来,让它们之间可以互相替换, 让这些行为的变化独立于拥有这些行为的客户。
GoF《设计模式》中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。
Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。
GoF《设计模式》中说道:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
从这点看:
策略模式是通过不同的算法做同一件事情:例如排序
而命令模式则是通过不同的命令做不同的事情,常含有(关联)接收者。
目标不同!
命令模式是含有不同的命令(含有接收者的请求):做不同的事情;隐藏接收者执行细节。常见菜单事件,
而策略模式含有不同的算法,做相同的事情;
区别在于是否含有接收者。命令模式含有,策略模式不含有。命令模式中的命令可以单独运行。
打个比喻就是:
命令模式等于菜单中的复制,移动,压缩等,而策略模式是其中一个菜单的例如复制到不同算法实现。
个人观点:java 对象中,所谓做一件事情,其实就是执行一个方法;所谓面向接口,就是自己不干事,交给别人干;策略模式中,对象的行为委托给了不同的策略;命令模式中,对象的行为委托给了命令,命令又将行为委托给了接收者;就是说,命令模式中,命令接口其实就是命令发出者和接收者的一个中间层,使达到解耦的目的;老话说的好,没啥问题是加一个中间层解决不了的,实在不行,再加一层;当然,如果命令的接收执行者是多人,那就又可以考虑责任链模式了