zoukankan      html  css  js  c++  java
  • 《Java8实战》

    模板模式是啥?

    一个抽象类Template主类,充分发挥抽象类的作用,一部分方法定义好,另一部分以接口的形式体现——需要每个子类具体地进行实现。

    适用栗子:

    1. 造房子的时候,地基、走线、水暖、水管都是一样的,只有在建筑的后期才需要加自定义的冰箱、电视机、热水器等,自定义的部分交给住户自己实现决定。
    2. 西游记的九九八十一难,唐僧四人必须一个不漏地走完,这就是固定部分的模板;除了菩萨定好的,途中的支线任务,这部分菩萨只写了接口,唐僧四人组完全可以自由发挥,选择不同的具体实现。
    3. spring 中对 Hibernate 的支持,将一些已经定义好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
    4. TransactionTemplate 事务
    此接口是事务管理的核心,提供了三个需要实现的函数:(实现手动)
    commit(TransactionStatus status) ;   
    getTransaction(TransactionDefinition definition) ;   
    rollback(TransactionStatus status) ;
    

    5.JdbcTemplate,jdbc提供的数据访问模板,分别适用于不同的持久化机制,Spring将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板和回调。模板就指的是模板方法,固定的有数据库连接池等内容,不固定的有sql方法——子类具体实现。

    优缺点

    1. 封装不变部分,用final进行方法的修饰
    2. 可变的部分,用接口来展示即可

    代码Template主类

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

    其他的步骤,就是子类继承后必须重写对应的方法,然后实例化子类,调用父类play方法

    试试Lambda简化后的GameOrderTemplate

    /*
     * @description 使用Lambda表达式简化
     * @Date 2020/3/2 17:43
     */
    public class LambdaGameOrderTemplate {
    
    //    abstract void initialize();
    //    abstract void startPlay();
    //    abstract void endPlay();
    
        //模板 打游戏方法
        public final void play(Consumer<String> initialize, Consumer<String> startPlay, Consumer<String> endPlay) {
            //初始化游戏
            initialize.accept("初始化游戏...");
    
            //开始游戏
            startPlay.accept("开始游戏...");
    
            //结束游戏
            endPlay.accept("结束游戏...");
        }
    }
    

    主测试方法 , lambda方式搭配了它的一个特性方法Consumer.accept,做到不用继承父类就可以调用实现逻辑,不过实现逻辑扔到了调用方这里

    public class Main {
         /**一般方法*/   
        @Test
        public void startGame() {
            GameOrderTemplate orderTemplate = new BrainGameTemplate();
            orderTemplate.initialize();
        }
        /** lambda */
        @Test
        public void lambdaStartGame() {
            LambdaGameOrderTemplate orderTemplate = new LambdaGameOrderTemplate();
            orderTemplate.play(
                    System.out::println,
                    System.out::println,
                    (String c) -> {
                        System.out.println(c);
                    }
            );
        }
    }
    

    结果

    初始化游戏...
    开始游戏...
    结束游戏...
    

    同样,代码逻辑都扔到调用者这里,代码量小的话还可以,大的话,还是老老实实分类继承.

  • 相关阅读:
    tap事件的原理详解
    获取地理位置
    获取高度
    JSON字符串与JSON对象的区别
    zepto方法
    javascript 中 click 和onclick有什么区别呢
    oninput,onpropertychange,onchange的用法和区别
    js实时监听input中值得变化
    sql lock
    数据库SQL优化大总结
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/12396804.html
Copyright © 2011-2022 走看看