每天两个设计模式(五)策略模式、模板模式

策略模式

策略模式在实现上与工厂模式略微不同,还是那句话,工厂模式的关注点在创建对象上,而策略模式,我认为更关注的是结果,因为它在Context中直接执行了结果,并且返回了。既然说与工厂模式相同,那么我们就把工厂模式的代码拿过来,改造一下。
看代码:

//抽象出来相同的行为
public interface RunType {
    void runTp();
}

//各个业务类实现各自的行为
public class Person implements RunType {
    @Override
    public void runTp() {
        System.out.println("我是人,是2条腿走路");
    }
}

//各个业务类实现各自的行为
public class Cat implements RunType {
    @Override
    public void runTp() {
        System.out.println("我是小猫咪,是4条腿走路");
    }
}


//创建工厂,工厂根据不同的参数,创建对应的业务类
public class FactoryObject {
    public RunType getRObject(String param){
        RunType rt = null;
        if(StringUtils.equals(param,"1")){
            rt = new Person();
        }else{
            rt = new Cat();
        }
        return rt;
    }
}

如果我们使用策略模式,在代码实现上的区别就是factory了,策略模式的factory(Context):

public class Context{
	private RunType runType; 
	public Context(RunType runType){
      this.runType= runType;
   }
    public RunType doRunTp(){
        runType.runTp();
    }
}

//测试类

class testFactory{
    public static void main(String[] args) {
        FactoryObject fo = new FactoryObject();
        RunType rt = fo.getRObject("1");
        rt.runTp();
    }
}

在代码上,我们还看到了,策略模式在实现上,消除了过多的if…else逻辑,直接将执行结果返回,所以我才认为策略模式的关注点是结果,不关心对象的创建过程。
而且在扩展方面,策略模式较于工厂模式,另一个优点就是,在扩展的时候,只需添加策略类即可,不会像工厂模式那样,需要修改工厂类

  1. 用途不一样。工厂模式是创建型模式,它的作用是创建对象。策略模式是行为型模式,作用是在许多行为中选择一种行为,关注的是行为的多样性。
  2. 解决的问题不同。工厂模式是解决资源的统一分发,将对象的创立同客户端分离开来。策略模式是为了解决策略的切换和扩展。
  3. 工厂相当于黑盒子,策略相当于白盒子。

模板模式

模板模式比较简单,就是一个创建一个东西,都需要哪些步骤,要实现步骤之后,还有提供一个方法,调用这些步骤,看代码,一看便知,很简单的

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}



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 Football();
      game.play(); 
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值