当前位置: 首页 > news >正文

策略模式和模板模式的区别

目录

一、实现方式

策略模式

模板模式

二、使用场景

三、优点

四、举例


一、实现方式

策略模式
  1. 定义策略接口 Strategy
  2. 创建具体策略类 OperationAdd、OperationSubtract、OperationMultiply
  3. 创建一个上下文类 Context,包含一个策略对象的引用,并通过该引用调用策略
模板模式
  1. 定义抽象父类 Game:包含模板方法和一些抽象方法或具体方法
  2. 实现子类 Cricket、Football:继承抽象父类并实现抽象方法,不改变算法结构
//1、定义策略接口
public interface Strategy {public int doOperation(int num1, int num2);
}//2、创建具体策略类
public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}
public class OperationSubtract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}
public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}//3、创建一个上下文类
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}
//1、定义抽象父类 Game
public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay(); //模板public final void play(){       initialize();//初始化游戏      startPlay();//开始游戏     endPlay();//结束游戏}
}//2、实现子类
public class Cricket extends Game { @Overridevoid endPlay() {System.out.println("Cricket Game Finished!");} @Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");} @Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play();      }
}

二、使用场景

策:当一个系统中有许多类,它们之间的区别仅在于它们的行为

模:当存在一些通用的方法,可以在多个子类中共用时

三、优点

策:算法自由切换,避免多重条件判断,扩展性好

模:封装不变部分,扩展可变部分,提取公共代码

四、举例

策:

  • 旅行方式的选择:骑自行车、坐汽车.....每种方式都是一个可替换的策略
  • Java AWT中的LayoutManager:不同的布局管理器实现了相同的接口,但提供了不同的布局算法

模:

  • 建筑流程:地基、走线、水管等步骤相同,但每一步里面具体的实现方法又有不同
http://www.lryc.cn/news/455244.html

相关文章:

  • 【ubuntu】ubuntu20.04安装conda
  • 使用 SAP ABAP Webdynpro 实现 ABAP Push Channel 的 Web Socket 客户端
  • 15分钟学 Python 第41天:Python 爬虫入门(六)第二篇
  • 电脑提示d3dcompiler_47.dll缺失怎么修复,仔细介绍dll的解决方法
  • CPU中的寄存器是什么以及它的工作原理是什么?
  • 【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。
  • windows7 32bit安装JDK以及EclipseEE
  • Python中的Enum
  • 于BERT的中文问答系统12
  • 基于SpringBoot“花开富贵”花园管理系统【附源码】
  • MySQL连接查询:自连接
  • Prometheus+Grafana备忘
  • 基于ssm实现的建筑装修图纸管理平台(源码+文档)
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07
  • Mahalanobis distance 马哈拉诺比斯距离
  • R语言绘制直方图
  • 论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning
  • 求二叉树的带权路径长度
  • Hive数仓操作(十五)
  • No.12 笔记 | 网络基础:ARP DNS TCP/IP与OSI模型
  • OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例
  • 简单易懂的springboot整合Camunda 7工作流入门教程
  • LabVIEW提高开发效率技巧----点阵图(XY Graph)
  • C++-匿名空间
  • jdk的安装和环境变量配置
  • 继承、Lambda、Objective-C和Swift
  • 设置服务器走本地代理
  • 刷题 -哈希
  • React响应式修改数组和对象
  • cerbot https证书免费自动续期