前言
最近这两天电脑充电线坏掉了,暂时中断了对HTTP的学习(依赖于电子书),利用少有的空闲时间看了看《汇编语言》与《Head First 设计模式》这两本书,输入了不少,还没产生输出,因此在这里叨叨两句。
《Head First 设计模式》是基于Java的一个讲程序设计经验的书,从开发者的维护、扩展等角度看待代码的设计,更贴近生产的需求。这里着重的不是某种语言能力,而是在设计程序时的设计思想。这也是我第一次接触这方面的知识,带领我从更高的角度看待程序设计。体会到代码的艺术。
非常抱歉的是,拿到这本书已经整整一年了,感谢男神送的礼物哈哈!但始终没有沉下心来认真读一读。非常惭愧。男神大概是我学习计算机的领路人,告诉了我很多知识,也是他的热爱感染了我。Thanks a lot!
策略模式
这本书很方便小白学习的一点是,每个概念都是从实际开发中遇到的问题引入,通过一步步改进让读者领悟到设计模式的魅力。
有一款模拟鸭子的游戏,游戏中会出现各种鸭子,有的鸭子会飞,有的鸭子会叫,在游戏的开发过程中,也需要添加新种类的鸭子。
在代码实现中,所有鸭子(橡皮鸭、绿头鸭)继承自一个Duck类,Duck类中有许多鸭子通用的方法,包括swim等,若想不同的鸭子发出不同的叫声,则最容易想到的方法是
- 在每一种鸭子类的定义中,重新定义quack()方法。
但是该种方法会使后期的维护成本变高,不但会出现大量重复的代码,对动作修改的成本也会升高。因此继承并不是一个很好的解决方法,这也是在设计中遵守的一个原则
- 多用组合,少用继承。
另一个需要遵守的设计原则是:
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
把变化的、不稳定的代码抽取出来,不影响其他不变化的部分。在这里也就是将鸭子的行为抽取出来。而如何抽取出来呢?则是需要遵守的第3个原则:
- 针对接口编程,而不是针对实现编程
将变化的部分抽象为接口,比如QuackBehavior接口,不同的叫声则由行为类实现QuackBehavior接口完成。
这样的话整个代码结构如下所示:
//Duck.java
public abstract class Duck{
QuackBehavior quackBehavior;
public Duck{
}
public void performQuack(){
quackBehavior.quack();
}
}
//QuackBehavior.java
public interface QuackBehavior{
public void quack();
}
//Quack.java
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("Quack");
}
}
//MallardDuck.java
public class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack();
}
}
//DuckSimulator.java
public class DuckSimulator{
public static void main(String[] args){
Duck Simulator = new MallardDuck();
Simulator.performQuack();
}
}
代码的整体思路是通过实现叫这一行为的接口,在鸭子实例化的过程中,采用指定行为类。
这种设计模式就叫做策略模式:
- 策略模式定义了算法族,分别封装起来,然它们之间可以相互替换,让算法的变化独立于使用算法的客户。
Something Else
设计模式就是开发过程中积累下来的设计经验,也是开发者之间的黑话,掌握设计模式,既可以提高设计的实用性,也可以提高开发者之间交流的高效性。
路漫漫其修远,吾将上下而求索。
《Head First 设计模式》