设计模式学习笔记之策略模式

参考:《Head first 设计模式》,部分引用来自 http://www.cnblogs.com/colinsong/archive/2009/03/02/1401723.html


策略模式(Strategy):它定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it

设计原则:

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

优点:

  1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
  2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
        3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点:
  1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
      2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。(这本身没有解除客户端需要选择判断的压力,而策略模式与简单工厂模式结合后,选择具体实现的职责也可以由Context来承担,这就最大化的减轻了客户端的压力。)

理解:

书本说的Java中接口(Interface)有点类似于Objective-C中的协议(Protocol)的意味,注意到“针对接口编程”真正的意思是“针对超类型(supertype)编程”,在C++中可以使用由纯虚函数组成的类实现。

        设计方法其实就是使用组合代替继承,“HAS-A(有一个) 可能比IS-A(是一个)更好”,并且有助于实现封装的高内聚,低耦合。

        例如 我们要封装一个【按钮】控件类,这个类 HAS-A(有一个)画外观行为,输出文字行为,还能响应点击事件,对于不同按钮,每个行为都不一定相同,例如有些按钮外观是圆形的,有些按钮可以没有文字。如果 在基类 Button 中把这些行为实现了,或者要求其子类实现(C++用纯虚函数,Java,C#用接口,Objective-C用协议的必选方法),这些做法都是依赖于“实现”,我们都被绑得死死的,没办法更改行为。策略模式中的设计是,在子类中使用接口所表示的行为,实际的实现不会被绑定在子类中。这里的Button类添加三个成员:drawButtonView,drawButtonText,buttonClicked,那么Button想要画外观只要让 drawButtonView 对象去画就行了,例如一个按钮,在普通情况下都是方形,那么在Button中可以给 drawButtonView赋值一个DrawRectButton实例对象,当一个新的按钮需要实现圆形按钮,那么只需要重新给drawButtonView成员赋值一个DrawRoundButton的实例对象就行了,并且我们能在运行时通过多态动态地给它指定不同的drawButtonView行为。

PS,如果是C++中,DrawButtonView 应该是DrawRectButton,DrawRoundButton的超类


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值