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

目录

一、实现方式

策略模式

模板模式

二、使用场景

三、优点

四、举例


一、实现方式

策略模式
  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{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 + num2;
   }
}
public class OperationSubtract implements Strategy{
   @Override
   public int doOperation(int num1, int num2) {
      return num1 - num2;
   }
}
public class OperationMultiply implements Strategy{
   @Override
   public 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 { 
   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   } 
   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   } 
   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}

public class Football extends Game {
   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }
   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }
   @Override
   void 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:不同的布局管理器实现了相同的接口,但提供了不同的布局算法

模:

  • 建筑流程:地基、走线、水管等步骤相同,但每一步里面具体的实现方法又有不同
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值