设计模式(四)策略模式

题记

    码农:我到了公司,只需要打卡,上班,领工资就行了, 真好。
    经理:我到了公司,只需要上班,领工资就行了,真好。
    老板的儿子:我到了公司,只需要领工资就行了,真好。

概述

    策略模式可以理解为一种通过组合的方式来解耦代码间的关联性,大大的增加系统的弹性和灵活度,提高代码复用率,它是针对滥用继承的一剂良方。为了说明这一点,考虑题记中的情况,如何用继承来把他们表达出来, 您可能会想到以下几步:
    (1)建立一个顶层Person类,把说有人都有的领工资行为放进去,老板的儿子直接继承Person就行了。
    (2)码农和经理都要上班,领工资,所以再建立一个Worker类继承Person,再加上上班的行为,经理继承Worker类就可以了。
    (3)建立一个基础于Worker的PrimaryWorker类,它有打卡的行为。
    (4)码农Coder类继承PrimaryWorker类。
    类图如下:

继承类图

    上图中有什么问题呢?首先单纯的使用继承,已经使得这个系统的继承层次加深,使系统变得笨重不够灵活。比如有一天要新加一个类进来,你就得考虑让它继承那个类合适,很有可能它继承的父类中有它不想要的方法,这个时候你会想我再重新建立一个父类,长久下去,类结构就会变得愈来愈庞大,笨重。即使是同一种类,比如Coder类,它们的getSalary方法也有很大不同,但总有一些Coder他们的工资是一样的,比如3个Coder工资都为5K,2个Coder工资都为6K,这种情况你不得在每个Coder里面都重写getSalary方法,如果有一天那3个Coder工资都涨到7K,你又得重复修改3次getSalary方法。
    上述的根本原因是什么?就是全局都使用继承造成了系统的笨重,不够灵活。这个时候就需要使用策略模式了。

策略模式


策略模式

    可以看出,策略模式就是一种组合技术的使用,Strategy类提供统一接口(抽象类或接口),子类实现不同的策略,客户端Context持有接口的引用,这也是面向抽象编程的体现,降低了代码耦合度。
    使用组合有什么好处呢?很明显它加大了系统的灵活性,新建一个类时你可以按照自己的需求组合你想要的策略,而不用再
烦恼与让该类继承哪个父类。
    回到上面那个例子来:

策略模式类图

    从上图可以看出,原来的人物类数量骤减,只有3个了,而人物类的行为全部变成了策略,一个人物要拥有什么行为,直接把对应的策略组合进来就行了,一个行为要增加什么策略,直接实现接口添加一个策略就行了。而客户端(即人物类)持有的是接口变量,所以它只用调用接口的方法,而不关心具体是哪个策略,这就是一种解耦的体现,每个策略还可以很方便的复用,所以策略模式解决了滥用接触带来的系统笨重不灵活的缺点。实际上面向对象编程有一个原则就是多用组合,少用继承。

总结

    策略模式通过组合策略的方式大大地增加了系统的灵活性,当一个客户端需要具有多个不同行为,而每个行为又有多种实现的时候就可以考虑使用策略模式。比如一个游戏人物,具有武器,衣服等属性,但武器又有很多种,衣服也有很多种,随着人物的不断升级,或者不同人物的出现,就需要对这两个属性进行组合,这时候使用策略模式就再适合不过了。

参考资料

 1.《Head First设计模式》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值