“组件协作” 模式:
- 现代软件分工之后的第一个结果是 “框架与应用程序的划分” ,“组件协作” 模式通过晚期绑定,来实现框架与应用程序之间的松耦合。
- 典型模式:
- 模版方法(Template Method)
- 观察者(Observer / Event)
- 策略(Strategy)
一、代码示例
1.1 结构化软件设计流程
class Lib { //框架开发人员
public void step1() {
//...
}
public void step2() {
//...
}
public void step5() {
//...
}
}
class App { //应用程序开发人员
public void step3() {
//...
}
public void step4() {
//...
}
public static void main(String[] args) {
Lib lib = new Lib();
App app = new App();
lib.step1();
//...
lib.step2();
//...
app.step3();
//...
app.step4();
//...
lib.step5();
}
}
**问题:**每实现一次方法,都要把Lib中的step1,step2,step5写一遍,框架的复用性过低。
1.2 面向对象软件设计流程
abstract class Lib {
public void run() { //稳定
step1();
step2();
step3(); //变化
step4(); //变化
step5();
}
private void step1() { //稳定
//...
}
private void step2() { //稳定
//...
}
private void step5() { //稳定
//...
}
protected abstract void step3(); //变化
protected abstract void step4(); //变化
}
class App extends Lib {
public static void main(String[] args) {
Lib app = new App(); //多胎
app.run();
}
@Override
protected void step3() {
//...
}
@Override
protected void step4() {
//...
}
}
二、动机
- 在软件构件过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,导致无法和任务的整体结构同时实现。
- 在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。
三、模式定义
- 定义一个操作中算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义该算法的某些特定步骤。
四、应用举例
- 基本所有的框架都用到了模版方法模式
- Java的多线程
class Seller extends Thread {
private static int ticketNum = 100; //这里必须使用静态变量才能共享数据
@Override
public void run() { //变化
while(ticketNum > 0) {
System.out.println(getName() + ": " + ticketNum);
ticketNum--;
}
}
}
public class ThreadTest {
public static void main(String[] args) {
Seller t1 = new Seller();
t1.start(); //start是稳定的
}
}