设计模式:模板模式和策略模式混合使用

目录

有时单个设计模式并不能满足我们的业务需求,这个时候就要根据具体的业务来混合使用设计模式,其中模板模式和策略模式是比较常用的一个组合。模板模式可以定义这个逻辑的骨架,策略模式可以丰满具体细节的逻辑。

代码示例

java 复制代码
interface Strategy {
    void execute();
}
 // 策略实现类1
class StrategyImpl1 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略1");
    }
}
 // 策略实现类2
class StrategyImpl2 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略2");
    }
}
 // 模板类
abstract class Template {
    // 模板方法,定义了算法的骨架
    public void templateMethod() {
        System.out.println("执行模板方法的前置操作");
        executeStrategy();
        System.out.println("执行模板方法的后置操作");
    }
     // 抽象方法,由子类实现具体的策略
    protected abstract void executeStrategy();
}
 // 模板子类1
class TemplateImpl1 extends Template {
    private Strategy strategy;
     public TemplateImpl1(Strategy strategy) {
        this.strategy = strategy;
    }
     @Override
    protected void executeStrategy() {
        strategy.execute();
    }
}
 // 模板子类2
class TemplateImpl2 extends Template {
    private Strategy strategy;
     public TemplateImpl2(Strategy strategy) {
        this.strategy = strategy;
    }
     @Override
    protected void executeStrategy() {
        strategy.execute();
    }
}
 // 测试类
public class Main {
    public static void main(String[] args) {
        Strategy strategy1 = new StrategyImpl1();
        Strategy strategy2 = new StrategyImpl2();
         Template template1 = new TemplateImpl1(strategy1);
        template1.templateMethod();
         Template template2 = new TemplateImpl2(strategy2);
        template2.templateMethod();
    }
}

这个示例中,我们定义了一个策略接口和两个策略实现类。然后,我们创建了一个模板类,其中定义了一个模板方法和抽象方法。模板方法中包含了算法的骨架,而抽象方法则由子类实现具体的策略。最后,我们创建了两个模板子类,分别使用不同的策略实现类,并在测试类中进行调用。

这个示例是比较简单的示例,具体我们使用的时候会更加的抽象,比如会使用工厂模式把策略类放到工厂中。

优劣点

优点:

  1. 灵活性:通过策略模式,你可以定义多个不同的策略,并在运行时选择使用哪个策略。这使得系统更加灵活,能够根据不同的需求选择合适的策略。

  2. 可扩展性:通过模板模式,你可以定义一个算法的骨架,在模板方法中固定算法的结构,而将具体实现交给子类。这使得系统更容易扩展,可以通过添加新的子类来增加新的实现。

  3. 代码复用:模板模式和策略模式都鼓励代码的重用。模板模式中的模板方法可以在多个子类中共享,而策略模式中的策略可以被多个上下文对象共享使用。

  4. 易于维护:通过将算法的不同部分分离出来,模板模式和策略模式使得代码更加模块化和可维护。当需要修改某个算法的某个部分时,只需要修改相应的子类或策略类,而不会影响到其他部分。

  5. 松耦合:模板模式和策略模式的结合可以实现松耦合的设计。模板模式中的抽象类和策略模式中的接口使得算法的具体实现与使用算法的类之间解耦,从而提高了系统的灵活性和可维护性。

缺点:

  1. 增加了项目的复杂度,对开发要求变高,代码复杂度增加。
  2. 对于新人来说,学习成本增加。新人只有了解了整个项目的设计才能进行开发。
  3. 类数量变多,使用多个设计模式就要遵循响应的规范,导致类数量大大增加,增加维护成本。

总结

总的来说,模板模式和策略模式的混合使用可以提供更灵活、可扩展、可维护的代码结构,同时促进代码的复用和松耦合设计。这种组合可以在需要定义算法骨架的同时,允许动态选择和切换不同的算法实现。

相关推荐
61900833618 小时前
linux 安装jdk
java·linux·运维
懂得节能嘛.18 小时前
【动态配置中心】Java+Redis构建动态配置中心
java·开发语言·redis
专注于大数据技术栈18 小时前
Java中JDK、JRE、JVM概念
java·开发语言·jvm
YuanlongWang18 小时前
C# 基础——值类型与引用类型的本质区别
java·jvm·c#
Kay_Liang19 小时前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯19 小时前
Java 如何学习Docker
java·后端·架构
自由的疯19 小时前
Java Docker本地部署
java·后端·架构
007php00719 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠19 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存
一勺菠萝丶19 小时前
在 macOS 上用 Docker 为 Java 后端 & 常见开发需求搭建完整服务(详尽教程)
java·macos·docker