软件的可扩展性
软件善变,可扩展性成为评价软件生命力的重要指标。
所谓的可扩展性是指软件为了应对将来的业务变化,而提供的扩展能力。当有新的业务发生时,可扩展性较好的软件仅需小范围修改就能提供支持,它们可以保持总体上的稳定。
传统的结构化软件设计方法在这方面力有不及,面向对象方法却有一些天然的优势。
类的扩展能力
面向对象方法带来的扩展能力首先表现在对象(object)上。对象是面向对象软件的基本活动单元,它们封装了软件中最容易发生变化的数据和功能,其本身则相对稳定。
对象由类(class)描述。
我们引用乐府诗《江南》考察类的表现。
// 莲蓬
public class Seedpod {
private String state;// 江南可采莲
}
// 鱼
public class Fish {
public void play() {
// 鱼戏莲叶间。鱼戏莲叶东。
}
}
在"采莲"系统中,莲蓬由生及熟(数据变化),鱼儿在不同的地方嬉戏(功能变化),这些变化仅发生在对象或类的内部。从外部来看,"莲蓬"类和"鱼"类并没有多大变化,它们的基本结构保持稳定。
抽象类和接口的扩展能力
当类本身不足以应对变化时,不妨对类进行一定程度的抽象。抽象化类可以舍弃一些易变因素,从而变得更加稳定。抽象化类的代表是抽象类(abstract class)和接口(interface)。
我们使用这种方法改写刚才的例子。
// 收获
public abstract class Harvest {}
// 嬉戏
public interface Playable {
public void play();
}
// 莲蓬
public class Seedpod extends Harvest {}
// 鱼
public class Fish implements Playable {
public void play() {}
}
我们分别以"莲蓬"类和"鱼"类为基础,抽象出了"收获"抽象类和"嬉戏"接口。抽象类和接口舍弃了原始类中的具体内容,但保留了系统的关键特性(收获与嬉戏的乐趣)。
"采莲"系统由此分成了两个层次:抽象层和具体层。抽象层相对稳定,具体层容易变化。
若采莲人(Picker)一时兴起采了一朵花苞(Bud),和同伴嬉戏起来------我们只需扩充具体层的实现,不必修改抽象层的结构。

构建软件时,可以把相对稳定的逻辑写在抽象层,起到提纲和约束的作用;把容易变化的逻辑写在具体层,限制变化的范围。
设计模式
实践中如何发挥好抽象化类的优势,为软件预留好可扩展性,正是我们的主角------设计模式------重点关注的内容。
设计模式是众人长期实践经验的总结。
后续文章将为您介绍23种设计模式,并揭示它们的思考路径与内在联系。这些设计模式来自Erich Gamma等人合著的《Design Patterns》,这是一部广为流传的经典著作,也是这门实践经验理论化的先声。
原著中作者将设计模式分成了创建型、结构型与行为型三种类型,由于这种分类方法具有一定的迷惑性,这里不再采用。
我们将用一种新的分类方法重新梳理它们。