zoukankan      html  css  js  c++  java
  • 设计模式-Template_Method模式

    模版方法模式属于行为型模式。模版方法模式的意图是在一个方法里实现一个算法,并推迟定义算法中的某些步骤,从而让其他类重新定义他们。

    一个例子

    在项目中经常会用到RedisTemplate,restTemplate,JdbcTemplate之类的对象。因为在操作资源的时候,通常会涉及到打开连接,使用资源,关闭连接的过程。但是这几个步骤又是很通用的,所以开发者抽象出来一个模版来定义一个算法骨架,然后通过子类的方式来定义各种资源具体的操作。
    image

    抽象模版类

    /**
     * 数据源操作模版
     *  @author: xujian
     *  @Date: 2019-09-26
     *  @Description:
     */
    public abstract class AbstractDataSourceTemplate {
        /**
         * 开启连接
         */
        abstract void open();
    
        /**
         * 执行操作
         */
        abstract void execute();
    
        /**
         * 关闭连接
         */
        abstract void close();
    
        /**
         * 模版方法
         */
        public final void run() {
            open();
            execute();
            close();
        }
    }
    

    Redis操作实现类

    public class RedisDataSourceTemplate extends AbstractDataSourceTemplate {
        /**
         * 开启连接
         */
        @Override
        void open() {
            System.out.println("开启redis连接...");
        }
    
        /**
         * 执行操作
         */
        @Override
        void execute() {
            System.out.println("操作redis...");
        }
    
        /**
         * 关闭连接
         */
        @Override
        void close() {
            System.out.println("关闭redis连接...");
        }
    }
    

    Jdbc操作实现类

    public class JdbcDataSourceTemplate extends AbstractDataSourceTemplate {
        /**
         * 开启连接
         */
        @Override
        void open() {
            System.out.println("开启jdbc连接...");
        }
    
        /**
         * 执行操作
         */
        @Override
        void execute() {
            System.out.println("操作jdbc...");
        }
    
        /**
         * 关闭连接
         */
        @Override
        void close() {
            System.out.println("关闭jdbc连接...");
        }
    }
    

    使用

            //jdbc模版
            AbstractDataSourceTemplate template = new JdbcDataSourceTemplate();
            template.run();
            System.out.println("----------------");
            //redis模版
            AbstractDataSourceTemplate template1 = new RedisDataSourceTemplate();
            template1.run();
    
    开启jdbc连接...
    操作jdbc...
    关闭jdbc连接...
    ----------------
    开启redis连接...
    操作redis...
    关闭redis连接...
    

    总结

    • 封装不可变部分,扩展可变部分
    • 提取公共代码,便于维护
    • 行为由父类控制骨架/算法,子类实现
    • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象
    • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度

    你可以在这里获取相关代码:设计模式-Template_Method模式

  • 相关阅读:
    如何提高网站在Google的排名(2)
    Key Words in my 2006
    UML: 关系
    What's SOAP
    "你试图打开的项目是Web项目,请指定URL路径"问题及解决方法
    WinXP下装SQL2000企业版
    多表联合查询的问题。。。。。
    实习技术员的基本功(十一)
    实习技术员的基本功(五)
    实习技术员的基本功(六)
  • 原文地址:https://www.cnblogs.com/xuxiaojian/p/11593560.html
Copyright © 2011-2022 走看看