设计模式之模板方法模式

本文介绍如何使用模板方法设计模式来减少代码重复,并通过实例演示如何将相似类中的重复流程抽象到父类中,以实现更好的代码组织和维护。

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

  • 小思绪:设计模式讲究的就是一个平衡,应用架构讲究的也是平衡。

有如下两个类

//BMWCar
public class BMWCar {

    public void start(){
        System.out.println("宝马车启动!");
    }

    public void stop(){
        System.out.println("宝马车停止");
    }

    public void alarm(){
        System.out.println("宝马车响喇叭");
    }

    public void run(){
        this.start();
        this.alarm();
        this.stop();
    }
}

//BenzCar
public class BenzCar {

    public void start(){
        System.out.println("奔驰车启动!");
    }

    public void stop(){
        System.out.println("奔驰车停止");
    }

    public void alarm(){
        System.out.println("奔驰车响喇叭");
    }

    public void run(){
        this.start();
        this.alarm();
        this.stop();
    }
}

我们发现上面两个类中run()方法存在重复,我们可以把重复代码抽取出来,于是引入模板方法模式:

模板方法

首先我们在实现需求的时候,发现子类有重复的代码,而且这个代码都是一个标准流程。这个时候我们引入模板方法设计模式,然后重复的部分抽象到父类中。

模板方法的优点
1. 模板方法是为了封装不变,扩展可变部分
2. 提取公共部分,便于代码的维护
3. 行为由父类控制,子类实现

定义一个抽象的父类Car,BenzCar和BMWCar都去继承Car

public abstract class Car {

    protected abstract void start();

    protected abstract void stop();

    protected abstract void alarm();

    public final void run(){
        this.alarm();
        this.start();
        this.stop();
    }

}
  • 上述代码中,用final修饰run()方法,阻止子类覆盖run()方法,保证行为由父类Car控制。
public class BMWCar extends Car{

    protected void start(){
        System.out.println("宝马车启动!");
    }

    protected void stop(){
        System.out.println("宝马车停止");
    }

    protected void alarm(){
        System.out.println("宝马车响喇叭");
    }

}
public class BenzCar extends Car{

    protected void start(){
        System.out.println("奔驰车启动!");
    }

    protected void stop(){
        System.out.println("奔驰车停止");
    }

    protected void alarm(){
        System.out.println("奔驰车响喇叭");
    }

}
  • protected修饰start()、stop()、alarm()三个方法,阻止在不同包中的客户端Client自己去调用它们。Car bmwCar = new BMWCar(); bmwCar.start();//这种调用方式就被阻止了
    Client:
public class Client {

    public static void main(String[] args) {
        Car bmwCar = new BMWCar();
        bmwCar.run();

        Car benzCar = new BenzCar();
        benzCar.run();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值