策略模式(Strategy Pattern)
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
可怕的问题
对代码所做的局部修改,影响层面可不是局部(会飞的橡皮鸭)
怎么办?
采用良好的OO软件设计原则。
设计原则(第一个设计原则)
找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
换句话说,如果每次新的需求一来,都会使某方面的代码发生变化,那么可以确定这部分代码需要抽取出来。——代码变化引起的不经意后果变少,系统变得更有弹性。
设计原则
针对接口编程,而不是针对实现编程
针对实现编程:
// 声明变量d为Dog类型(是Animal的具体实现),会造成我们必须针对具体实现编码
Dog d = new Dog();
d.bark();
针对接口/超类编程:
// 知道对象时狗,但是利用animal进行多态的调用
Animal animal = new Dog()
Animal.makeSound();
更棒的是,子类实例化的动作不再需要在代码中硬编码,例如:new Dog(),而是“在运行时才指定具体实现的对象”。
// 我们不知道实际的子类型是“什么”….我们只关心它如何正确地进行makeSound()的动作就可以了。
a = getAnimal();
a.makeSound();
设计原则
多用组合,少用继承。
设计模式让你和其他开发人员之间有共享的词汇,一旦懂得这些词汇,和其他开发人员之间沟通就很容易,也会促使哪些不懂的程序员想开始学习设计模式。设计模式也可以把你的思考架构的层次提高到模式层面,而不是仅停留在琐碎的对象上。
设计模式不会直接进入你的代码中,而是先进入进的“大脑”中,一旦你现在脑海中装入许多关于模式的知识,就能够开始在新设计中采用它们,并当你的旧代码变得如同搅和一团没有弹性的时候,可以用他们重构代码。
知道抽象、继承、多态这些概念,并不会马上变成好的面向对象设计者。设计大师关心的是建立弹性的设计,可以维护,可以应付变化。
相关推荐
策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes ...
《Head First设计模式》是软件开发领域的一本经典著作,由Eric Freeman、Elisabeth Robson、Bert Bates和Kathy Sierra合著。这本书以独特的视觉和易理解的方式介绍了设计模式这一复杂的概念,旨在帮助初学者和有经验...
HeadFirst设计模式第01章C++,C#,Java代码实现。 其中包括了第02页,第05页,第22页的代码。 菜鸟原创。 From: http://blog.csdn.net/neicole/article/details/7994083
Django遵循模型-视图-控制器(MVC)设计模式,但稍有不同,它将其称为模型-视图-模板(MVT)。它的核心组件包括模型(Models)、视图(Views)、模板(Templates)和URL调度器(URLConf)。 2. 创建Django项目: ...
- 创建模型后,需要执行数据库迁移来更新数据库模式: ```bash $ python manage.py makemigrations $ python manage.py migrate ``` 3. **操作数据库:** - 使用Django ORM(对象关系映射)对数据库进行增删改...
- **返回方法**: 设置$$return域值为1表示以只读模式返回。 #### 16. 刷新表单 - **刷新方法**: 通常使用客户端脚本或服务器端脚本来触发表单的重新加载。 #### 17. 怎样在文档里存照片? - **存储方法**: 可以...
Django 是一款用 Python 编写的高级 Web 开发框架,它遵循 MVC(Model-View-Controller)设计模式,旨在通过“ batteries included”(开箱即用)的方式简化 Web 开发过程。在 Django 中,表单(Form)是一个非常...
栈采用LIFO策略,而队列采用FIFO策略,但二者都限制了数据的访问方式,确保操作只发生在两端。 #### 6. 触发器设计 为了监视成绩表`Student_JAVA`中的数据插入和更新,并确保成绩不超过100分,应该使用`BEFORE`...
- Regular Expression Matching: 给定一个输入字符串和一个模式,实现支持'.'和'*'的正则表达式匹配。 - Container With Most Water: 给定一个数组,其中每个元素代表一个宽度为1的柱子高度,要求找出两个柱子,使得...
它以其简洁的API和对MVVM(Model-View-ViewModel)设计模式的支持而受到开发者欢迎。在这个入门教程中,我们将深入探讨如何使用Taunus来开发你的第一个应用。 首先,确保你已经安装了Node.js,因为Taunus是用...
booter的格式可能根据LessOS的具体实现而有所不同,但通常会包括一些基本的初始化代码,比如设置堆栈指针、加载GDT和IDT、设置段寄存器、跳转到保护模式等。解析这部分代码需要理解汇编语言和x86体系结构。 在C语言...
$full1 = "$first $second"; # 产生 Hello World $full2 = '$first $second';# 产生 $first $second 可以将字符和数字利用运算符号连接起来。字符被转化成数字,利用其最初位置。在PHP手册中有详细的例子。 数组与...
3.4.2. 设计回顾 3.4.3. 配置选项 3.4.4. Resolvers 3.4.4.1. 文件 Resolver 3.4.5. 基本用法 4. Zend_Cache 4.1. 简介 4.2. 缓存原理 4.2.1. Zend_Cache 工厂方法 4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. ...