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

最近在看《Head First 设计模式》。收获蛮多的,所以也写一写自己的收获和感悟。

首先,什么是设计模式。我觉得设计模式可以理解为套路。模式不是代码,而是针对设计问题的通用解决方案。在不同的需求,不同的要求下,我们怎么来设计我们的类,怎么来安排类与类之间的关系,从设计模式中,我们能够得到很好的启发。可以说设计模式能够帮助我们将应用组织成容易理解,容易维护,具有弹性的框架。学习设计模式,也就是在学习其他开发人员的智慧与经验。

这几天了解了第一个模式——策略模式定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于使用算法的客户。

也就是一个类的行为被封装进了一组类中,可以被轻易的扩充与改变,如果需要,甚至可以在运行的时候也可以改变行为。

如果单看这个定义,很难明白,所以我们来看一下几个设计原则:

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

这个其实很好理解,首先,我们都知道在软件开发过程中往往会遇到这样的事就是——改变,修改代码。随着需求的变化,技术的改变,数据更新等等,我们都往往需要去改变代码,如果设计的不好,往往会很悲惨。所以如何让我们现在写的代码,在之后的时间里也能够用的上,这个原则就很重要。

这个原则也可以理解为,把会变化的部分,单独取出来并封装起来,好让之后进行扩充,改变,却不影响其他不需要改变的部分。这也就减少了很多的工作量。我们的代码也并的更加有弹性。

比如说游戏的角色类需要一个飞行的行为,但是每一角色的飞行动作都不一样,而且也不是所有的角色都一开始就会飞。所以飞行的行为就是一个改变的行为。我们把它分离出来然后进行封装。封装的方法就是,把会改变的行为定义成接口,然后再定义专门的类来实现它。

l 第二个原则就是针对接口编程,而不是针对实现编程。

针对接口编程也就是针对超类型编程——变量的申明类型应该是超类型,通常是一个抽象类型或者说是一个接口,这样做的一个好处是我们可以在运行的时候改变调用的对象。对于这个原则,我们可以理解为,当A类拥有一个B超类(为接口或者说抽象类)时,A就可以调用所有实现了B类的类所产生的对象,所以说我们在运行的时候可以改变调用的对象(可以变成B的子类)。

其实这个原则在JAVA的很多地方都可以看到:

比如说JTree

我们来看一下他的部分源代码:

public class JTree extends JComponent implements Scrollable, Accessible
{/*** The model that defines the tree displayed by this object.*/transient protected TreeModel        treeModel;/*** Models the set of selected nodes in this tree.*/transient protected TreeSelectionModel selectionModel;/*** The cell used to draw nodes. If <code>null</code>, the UI uses a default* <code>cellRenderer</code>.*/transient protected TreeCellRenderer  cellRenderer;

无论是JTree,JList还是JComboBox,他们都有类似的属性,model以及render,也就是模型以及渲染器。

在上面的JTree中的三个属性, treeModel,selectionModel以及cellRenderer分别是TreeModel,TreeSelectionModel,TreeCellRenderer的对象,而他们都是接口。在java中也提供了实现了这个接口的类,例如:TreeModel有DefaultTreeModel。TreeCellRenderer 有DefaultTreeCellRenderer。

在创建的时候,我们需要去实现一个子类来赋给treeModel这个对象,这个类可以是java默认的,也可以是我们自己写的。

“针对接口编程”,关键就是利用了多态, 程序针对超类型编程,执行时会根据实际实际状况执行到真正的行为,不会被绑死在超类型的行为上。

l 第三个原则:多用组合,少用继承

理由: 使用组合建立的系统具有很大的弹性,不仅可将算法组封装成类,更可以“运算的时动态改变行为”,只要组合的行为对象符合接口的标准即可。

所以,类与类之间的关系,“有一个”可能比“是一个”更好。

转载于:https://www.cnblogs.com/hesi/p/6286863.html

设计模式学习笔记—策略模式相关推荐

  1. [设计模式学习笔记] -- 策略模式

    策略模式 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 举一个简单的例子来描述策略模式. 设计一款冷兵器时代士兵打仗的游戏,游戏内部设计要使用OO技术. ...

  2. Java-马士兵设计模式学习笔记-策略模式-模拟Comparable接口

    一.情况 1.目标:要在专门用于排序数据的DataSorter.java中实现对所有A类,B类,C类,D类等等的排序 2.初步想法:DataSorter.java的代码如下 public class ...

  3. 设计模式学习笔记——策略(Strategy)模式

    设计模式学习笔记--策略(Strategy)模式 @(设计模式)[设计模式, 策略模式, Stategy] 设计模式学习笔记策略Strategy模式 基本介绍 策略案例 类图 实现代码 Hand类 S ...

  4. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  5. 设计模式学习:策略模式

    策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现.策略模式最大的特点是行为的变化,行为之间可以相互替换.每个if判断都可以理解为就是 ...

  6. Head First设计模式读书笔记——策略模式

    问题描述: 目前的任务是实现一个FPS类游戏的各种角色(友军.敌军.平民和狗.猫.鸭子等动物)以及他们的各种行为(攻击.游泳等). 设计方案一 很简单,只要实现一个角色超类,将角色的各种行为放入超类中 ...

  7. 设计模式学习01策略模式记录

    (个人记录)策略模式带来的好处就是更加的有弹性,可以很方便的动态改变对象的行为,在已经固定的项目中如果要增加新的类型,在项目中我们要分析变化部分与不变部分. 将变化的部分(也就是策略算法)使用接口的方 ...

  8. 设计模式学习笔记——外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  9. 设计模式学习之策略模式(Strategy,行为型模式)(13)

    转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...

  10. 设计模式学习笔记-原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象: 二.模式中的角色 Prototype:声明一个克隆自身的接口: ConcretePrototype:实现一个克隆自身的操作: ...

最新文章

  1. ue4 无限地图_RPG游戏开发日志13:无限地图的实现
  2. java知识点--基础篇(5)
  3. 爱因斯坦:量子物理与抽象数学(广义)
  4. Centos下载地址
  5. undo_management设置与隐含参数*._offline_rollback_segments和*._corrupted_rollback_segments关系...
  6. Go语言的flag库、os库、strconv库
  7. 优化理论11---- Zoutendijk可行方向法、非线性约束情形、ε起作用约束可行方向法、Frank-Wolfe 方法
  8. 着力财富管理市场产品全覆盖 基金公司争设销售子公司
  9. pytorch和python一样吗_PyTorch可以和TensorFlow一样快,有时甚至比TensorFlow更快了?...
  10. 植物大战僵尸的java源代码_植物大战僵尸java源码
  11. 2020科目一考试口诀_2020驾考技巧科目一考试口诀答题法
  12. 数据库脏读、不可重复读、幻读以及对应的隔离级别
  13. MySQL8.0超细致下载安装教程
  14. 跨境电商运营 | 如何利用Instagram进行电子商务营销
  15. 前端云原生——微信小程序云服务配置
  16. 局域网匿名访问共享文件的设置方法?
  17. docker常用命令(学习自用)
  18. 时间序列中的平稳性检验之单位根检验
  19. python实例(一):验证输入的手机号码是否为中国移动手机号码
  20. jason3的ku、c波段的有效波高数据下载

热门文章

  1. 再见,2016,你好,2017
  2. mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
  3. 空间变量php,PHP名称空间可以包含变量吗?
  4. shell按照时间排序_初识Shell(3)
  5. mysqloffset什么意思_mysql查询时offset过大影响性能的原因和优化详解
  6. NULL值的处理注意不同数据库区别
  7. linux HZ 值_Linux操作系统中进程的操作命令(ps,kill,keep)
  8. 下列哪种不是python元组的定义方式_python笔试题
  9. 在Nutz中给Druid配置数据库加密
  10. kindeditor上传图片编辑框乱码问题