zoukankan      html  css  js  c++  java
  • 3.设计模式----TemplateMethod模式

    模板模式,其实是一种思想,在开发中有很多地方用到模板,因为毕竟我们不可能每一个都一出一段!一个模板,填充不同,出来效果也是不一样!

    准备画个时序图的,没找到工具,过几天补上!

    模板模式在出现bug时候,也只需要去调整模板就好了,不需要大范围的改动代码!

    Demo:

      

    package template.method;
    /**
     * 模板模式:
     *     具体处理方法需要子类自己去实现,流程定义在父类中,调用时候,调用父类中得方法时候
     * 出现的结果也会不一样!,这就是模板方法,
     * 相当于,一个相同的模板,你填充不同的东西后,出现就是不一样的!
     * @author zengrong
     *
     */
    public abstract class AbstractDisPlay {
        /**
         * 定义三个抽象方法
         */
        public abstract void open();
        public abstract void look();
        public abstract void close();
        /**
         * 定义一个模板:
         * 这模板调用了三个抽象方法,但是具体干啥,谁都不知道!
         */
        public final  void show() {
            open();
            for (int i = 0; i < 5; i++) {
                look();
            }
            close();
        }
        
    }
    package template.method.ch;
    
    import template.method.AbstractDisPlay;
    /**
     * 继承抽象类,第一个小伙伴继承了,
     * @author zengrong
     *
     */
    public class StOne extends AbstractDisPlay {
    
        private Integer num;
        
        public StOne(Integer num) {
            this.num = num;
        }
    
        @Override
        public void open() {
        System.out.println("快bo网");
            
        }
    
        @Override
        public void look() {
            System.out.println("苍老师日语教学第"+num+"部");
            num++;
            
        }
    
        @Override
        public void close() {
            System.out.println("他爸爸回来了,不学了,关闭了!");
            
        }
    
    }
    package template.method.ch;
    
    import template.method.AbstractDisPlay;
    /**
     * 第二个小伙伴
     * @author zengrong
     *
     */
    public class StTwo extends AbstractDisPlay {
        private String str;
        
        public StTwo(String str) {
            this.str = str;
        }
    
        @Override
        public void open() {
            System.out.println("打开了日语网站");
        }
    
        @Override
        public void look() {
            System.out.println("网站提供了"+str);
        }
    
        @Override
        public void close() {
            System.out.println("看了一会网站被关闭了。。。");
        }
    
    }

    模板模式:

      1.抽取了共同的方法在父类直接在抽象类中给出具体实现。而对于有差异性的步骤,则在各自的具体类中给出实现。在父类中定义为抽象方法

      2.使用模板类方法去限定制了以后会出现的算法框架

    这个就是模板,算法逻辑已经固定了,

    模板方法模式中的三类角色

    1、具体方法(Concrete Method)

    2、抽象方法(Abstract Method)

    3、钩子方法(Hook Method) 

    举个例子:  

    • 泡茶:
      烧开水 ==> 冲泡茶叶 ==> 倒入杯中 ==> 添加柠檬
      泡咖啡:
      烧开水 ==> 冲泡咖啡 ==> 倒入杯中 ==> 添加糖和牛奶

      上面这一个流程:

        烧开水,倒入杯中 这二个是共同的,可以抽到父类中去,

        冲???添加??具体怎么做你也不知道,抽成抽象方法;

        那么模板是什么?

      

    customWantsCondiments相当于钩子,true时候,说么是和这个有关系的,
      // 模板方法,决定了算法骨架。相当于TemplateMethod()方法
        public void prepareBeverage() {
            boilWater();
            brew();
            pourInCup();
            if (customWantsCondiments())
            {
                addCondiments();
            }
        }

    总结:

    使用模板方法模式可以将代码的公共行为提取,以达到复用的目的。

    而对于特殊化的行为在子类中实现。父类的模板方法可以控制子类中的具体实现。

    子类无需了解整体算法框架,只需实现自己的业务逻辑即可。 

      

          

  • 相关阅读:
    rpm包安装及卸载
    linux常用命令100
    Haproxy负载均衡与高可用
    nginx+keepalived实现高可用案例
    LVS+keepalived
    NFS 共享存储与LVS
    Tomcat Session简介及绑定
    LVS DR 模式
    LVS搭建
    LVS简介与集群及类型介绍
  • 原文地址:https://www.cnblogs.com/java-synchronized/p/6649071.html
Copyright © 2011-2022 走看看