Java设计模式——模板方法模式

⚪模板方法模式(Template Method)是一种行为型设计模式,这个模式使得子类可以重新定义算法的某些步骤,而不改变算法的结构。

⚪意图:它定义了一个算法的骨架,将一些步骤延迟到子类中实现。

⚪以下是工厂方法模式的关键要点:

        ▷ 角色和责任

 

  1. 抽象模板(Abstract Template):定义了一个算法的骨架,包含一个或多个抽象方法,这些方法由子类来实现。它还可以包含一些具体的方法,这些方法在算法的实现中通常是固定的,但可以被子类覆盖。
  2. 具体模板(Concrete Template):实现了抽象模板中的抽象方法,完成算法的具体步骤。但它不会改变算法的结构,而是保持不变的部分。

 

        ▷ 工作流程

  1. 抽象模板中定义了算法的骨架,包括一些具体的方法和抽象方法。
  2. 具体模板继承自抽象模板,并实现了其中的抽象方法,完成了算法的特定步骤。
  3. 客户端代码创建具体模板的实例,并调用模板方法来执行算法。模板方法调用了抽象方法,这些方法由具体模板提供具体实现。
  4. 具体模板的子类可以覆盖抽象方法,以定制算法的某些步骤,但不能改变算法的结构。

        ▷ 示例

// 抽象模板
abstract class CookingTemplate {
    // 模板方法,定义了炒菜的步骤
    public void cook() {
        prepareIngredients();
        heatPan();
        stirFry();
        addSeasonings();
        serveDish();
    }

    // 抽象方法,由具体模板子类实现
    protected abstract void prepareIngredients();

    protected abstract void heatPan();

    protected abstract void stirFry();

    protected abstract void addSeasonings();

    protected abstract void serveDish();
}

// 具体模板1:炒青菜
class StirFriedVegetables extends CookingTemplate {
    @Override
    protected void prepareIngredients() {
        System.out.println("准备青菜和蒜蓉");
    }

    @Override
    protected void heatPan() {
        System.out.println("加热锅子");
    }

    @Override
    protected void stirFry() {
        System.out.println("翻炒青菜");
    }

    @Override
    protected void addSeasonings() {
        System.out.println("加酱油和盐");
    }

    @Override
    protected void serveDish() {
        System.out.println("上菜:青菜炒好了!");
    }
}

// 具体模板2:炒肉
class StirFriedMeat extends CookingTemplate {
    @Override
    protected void prepareIngredients() {
        System.out.println("准备肉和葱姜蒜");
    }

    @Override
    protected void heatPan() {
        System.out.println("加热锅子");
    }

    @Override
    protected void stirFry() {
        System.out.println("翻炒肉");
    }

    @Override
    protected void addSeasonings() {
        System.out.println("加酱油、糖和盐");
    }

    @Override
    protected void serveDish() {
        System.out.println("上菜:肉炒好了!");
    }
}

public class TemplateMethod{
    public static void main(String[] args) {
        CookingTemplate vegetables = new StirFriedVegetables();
        CookingTemplate meat = new StirFriedMeat();

        System.out.println("炒青菜:");
        vegetables.cook();

        System.out.println("\n炒肉:");
        meat.cook();
    }
}

⚪适用性

  1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  2. 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。

⚪应用场景

  1. 算法的框架固定,但具体步骤可以变化: 当你有一个算法的整体框架或流程是固定的,但其中某些具体步骤可能因应用场景或子类而异时,可以使用模板方法模式。这允许你将通用算法定义在一个抽象类中,并在子类中实现特定的步骤。
  2. 避免代码重复: 模板方法模式有助于避免在多个类中复制相同的代码,因为通用的算法步骤在抽象类中定义一次,可以在多个子类中重用。

⚪实际已有场景

  1. Java的I/O库: Java的I/O库中的InputStream和OutputStream类使用了模板方法模式。例如,InputStream定义了read()方法,这是一个模板方法,它的子类(如FileInputStream、ByteArrayInputStream)实现了具体的读取逻辑。
  2. JdbcTemplate类: 在Spring中,JdbcTemplate是一个用于执行SQL操作的模板类,它使用了模板方法模式。JdbcTemplate提供了执行SQL查询、更新等通用操作的方法,开发者可以创建子类并实现特定的SQL查询或更新操作。
  3. Spring的AOP(面向切面编程): Spring AOP允许你在应用程序的核心逻辑之外添加横切关注点。Spring AOP使用模板方法模式来创建代理对象,它会在目标方法前后执行额外的操作,例如日志记录、事务管理等。
  4. Spring的事务管理: Spring的事务管理机制也使用了模板方法模式。Spring提供了PlatformTransactionManager接口和TransactionTemplate类,它们定义了事务管理的通用模板,不同的数据源可以使用这些模板来进行事务管理,而具体的事务处理逻辑在子类中实现。

 

posted @ 2023-10-04 14:16  xiaogh  阅读(76)  评论(0)    收藏  举报