zoukankan      html  css  js  c++  java
  • java设计模式之模板方法模式

    模板方法模式

      定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式,如大话设计模式中说到的考试场景中,每个人的试卷都是一样的,只有答案不一样。这种场景就适合于模板方法模式。我这次自己写的是一个汽车启动的过程,每一种汽车启动的过程都基本是一样的流程,无非是这一过程中存在一些细小差别。

    模板方法模式UML图

      

    模板方法模式代码

    package com.roc.template;
    /**
     * 汽车模型
     * 模型模式
     * @author liaowp
     *
     */
    public abstract class CarModel {
         /**
          * 汽车启动
          */
         protected abstract void start();
        
         /**
          * 停车
          */
         protected abstract void stop();
         
         /**
          * 用户并不需要关注你的车怎么启动或者停下来的,可以开可以停就可以啦
          */
         final public void excet(){
             this.start();
             this.stop();
         }
    }
    package com.roc.template;
    /**
     * 大众车
     * @author liaowp
     *
     */
    public class Wcar extends CarModel{
    
        @Override
        protected void start() {
            System.out.println("大众车启动 。。。。。。。。突突突");
        }
    
        @Override
        protected void stop() {
            System.out.println("大众车停车。。。。。。。。。");
        }
    }
    package com.roc.template;
    
    public class Ocar extends CarModel{
    
        @Override
        protected void start() {
            System.out.println("奥迪  无匙启动               突突突");
        }
    
        @Override
        protected void stop() {
            System.out.println("奥迪  停车              ");
        }
    
    }
    package com.roc.template;
    /**
     * 客户端
     * @author liaowp
     *
     */
    public class Client {
        public static void main(String[] args) {
            CarModel wcar=new Wcar();//家里的第一辆车,作为用户的我们并不需要关注车怎么启动的.子类变量变为父类。多态
            wcar.excet();
            
            //突然家里需要第二辆车了   奥迪     我们也不需要关注他怎么生产启动的    
            CarModel ocar=new Ocar();
            ocar.excet();
        }
    }

    模板方法模式适用场景

    • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
    • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
    • 控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/liaoweipeng/p/5790395.html
Copyright © 2011-2022 走看看