2. 组件协作——模版方法模式

文章讨论了在软件开发中,通过模板方法模式实现框架与应用程序的松耦合,提高代码复用性。在结构化设计中遇到的问题是框架复用性低,而面向对象的模板方法模式通过将稳定部分定义在父类,变化部分留给子类实现,解决了这一问题。文中提供了代码示例,展示了如何在多线程场景下运用该模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“组件协作” 模式:

  • 现代软件分工之后的第一个结果是 “框架与应用程序的划分” ,“组件协作” 模式通过晚期绑定,来实现框架与应用程序之间的松耦合。
  • 典型模式:
    • 模版方法(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是稳定的

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值