每周学点设计模式——策略模式(上)

写在前面

为什么要学习设计模式

掌握设计模式对于程序开发有很多益处。首先,掌握设计模式可以借鉴前人的经验吸取已知的教训,让设计出的程序更具扩展性更好地应对需求的变化。其次,在开发人员日常的交流和沟通中可以理解对方说的行话。最后,可以顺利解答面试过程中设计模式的相关问题。

为什么要写这个系列博客

作为一名Java开发者,在学习设计模式的过程中我遇到了一些问题和困难。如何更好地了解和记住这些模式?在日常的开发中,有哪些东西运用了设计模式?通过设计模式如何解决实际遇到的问题,比如哪些场景会自然联想到运用某种模式?相信大家可能也有类似的疑问。

于是便有了写作“每周学点设计模式”系列博客的动力。目标是读过这个系列博客的朋友能够通过实例和场景更好地掌握设计模式相关知识,并且能够在自己的日常开发和学习过程中发现并使用设计模式。

博客的内容安排

设计模式学习以GOF经典的23个模式为提纲,每个模式单独讲解分为上、下两篇。

上篇会介绍模式的基本概念,并通过示例对模式的内容进行分析,最后是一些练习。练习涉及此模式相关的常见问题和示例分析题。通过练习可以巩固模式基本概念,并对身边的实例有分析和学习。下篇是练习讲解,我会给出自己对于这些问题的一些分析。一方面是自己学习的总结,另一方面可以作为参考解答与大家交流和探讨。

设计模式本身不局限某种语言。这里的问题和示例以Java语言为主。

策略(Strategy)模式(上)

这是“每周学点设计模式”系列中的策略模式。读完之后,你应该能回答以下几个问题:

  • 了解策略模式要解决的主要问题
  • 举出常见的策略模式使用场景
  • 说出JDK中运用策略模式的实例

注意:在阅读下篇之前请自己思考习题部分的问题,练习和独立思考对掌握模式知识的效果非常重要。

0、一份程序设计需求规格说明

请编写程序对输入框中的内容进行有效性检验。例如身份证信息输入框必须输入有效的身份证号码,密码输入框必须由字符、数字和至少一个符号组成。有效性检验通过Validator对象对输入框内容进行检查。对不同的国家,身份证和邮编遵循不同的验证规则,密码强度检验可由系统管理员进行配置。

是的,这份功能说明里最重要的两个关键词就是“规则”和“配置”。当你需要实现一组规则(算法),并且这些规则要求可配置和可扩展时,策略模式会是你的好帮手。

1、策略模式的抽象过程

简单的说,策略模式就是要应对规则变化和新规则加入对程序带来的影响。

对于面向对象程序设计如何实现呢?通过接口可以避免直接调用规则,从而使得业务变化不会对规则产生影响。同时,添加新规则也不会影响业务流程。

2、示例分析

回到开始的需求,对于Validator我们可以定义一个统一的接口,同时针对不同类型的验证实现具体的算法达到对扩展的要求。

当有输入时,Text控件会调用自己的Validator。每个Validator会根据自己的实现分别应用规则返回验证结果。

  • 控件验证逻辑只与Validator接口相关:实现了业务与规则的隔离
  • 只需实现Validator接口即可添加新规则

3、习题

#1.请说明策略模式符合哪些面向对象设计原则?

提示:面向对象的5个基本设计原则有单一职责原则、开放封闭原则、Liskov替换原则、依赖倒置原则和接口隔离原则。

#2.请说明策略模式有什么优点和缺点。

#3.请用说明下列Java API设计中是如何使用策略模式的?

  • Java.util.Collections#sort(List list, Comparator < ? super T > c)
  • java.util.Arrays#sort(T[], Comparator < ? super T > c)
  • Java正则表达式Pattern
  • ThreadPoolExecutor中的ThreadFactory和RejectedExecutionHandler
  • hashmap中对hashcode的计算
  • runnable与executor
  • recursive和forkjoin

#4.分析SWT中的RowLayout、FormLayout、GridLayout是如何运用设略模式的?

 

关于作者: 唐尤华

我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其实我是一个程序员。(新浪微博:@唐尤华

查看唐尤华的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

4 条评论

  1. guohaitao 说道:

    分析的很好,学习了

    Thumb up 1 Thumb down 0

  2. zilong 说道:

    面向对象思维的存在缺陷,所以设计模式出现了?您怎么看

    Thumb up 0 Thumb down 0

    • xiafei 说道:

      个人觉得 设计模式是从面向对象出发来设计的,是抽象出来的一些高效的设计理念,这种设计更符合面向对象的思维方式以及程序员的思维方式,而非补充所谓的缺陷。比如观察者模式、责任链模式,不都是从对象的角度来出发的么?

      Thumb up 0 Thumb down 0

  3. 0x0bject 说道:

    文章很好,如果打算写成一个系列的话,不妨“每周学点设计模式” + 编号 + “XX“……可能是我的阅读习惯吧,建议考虑下。

    Thumb up 2 Thumb down 0

跳到底部
返回顶部