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

    模板方法模式
    定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    结构图
    在这里插入图片描述
    应用
    在这里插入图片描述
    比如把大象放入冰箱需要3步

    1. 打开冰箱门
    2. 把大象塞进去
    3. 关上冰箱门

    代码实现

    public class Elephant {
        public void templateMethod() {
            // 第一步用打印代替
            System.out.println("打开冰箱门");
            // 第二步用打印代替
            System.out.println("放入大象");
            // 第三步用打印代替
            System.out.println("关闭冰箱门");
        }
    }
    

    这样实现完全没有问题,但是如果后面需要变化了,要将长颈鹿、老虎、狮子等等放入冰箱怎么办呢,需要在写一个类,重复以上的代码,只是放入的不是大象而是其他。

    重复代码 = 易错 + 难改

    这个时候就需要模板方法上场了,代码如下

    public abstract class AbstractClass {
        /**
         * 用于子类自定义的
         */
        abstract void primitiveOperation();
    
        public void templateMethod() {
            // 第一步用打印代替
            System.out.println("打开冰箱门");
            // 第二步用打印代替
            primitiveOperation();
            // 第三步用打印代替
            System.out.println("关闭冰箱门");
        }
    
        public void openRefrigeratorDoor() {
            System.out.println("打开冰箱门");
        }
    
        public void closeRefrigeratorDoor() {
            System.out.println("关闭冰箱门");
        }
    }
    
    public class ConcreteClass extends AbstractClass {
        @Override
        void primitiveOperation() {
            System.out.println("将大象放入冰箱");
        }
    }
    

    要将其他不同的放入冰箱则只需要建立满足需求的子类重写该方法即可。模板方法模式是通过把不变形为搬移至超类,去除子类中的重复代码来体现它的优势。

    优点
    模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

    缺点
    每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

    勿在浮沙筑高台 ——个人浅见,难免有误导之处,麻烦请指出。
  • 相关阅读:
    make menuconfig显示错误“Your display is too small to run Menuconfig!”
    程序员的那点事(转自java老师李明志)
    不必太羡慕别人
    把数据存储到 XML 文件
    关于session
    网页中的服务器端和客户端脚本
    没有一种成功是不经历磨砺的
    考试导数据总结(一)
    我们应该爱上“犯错”——读应试教育的死穴,恰在于堵死了孩子“犯错”的空间
    软考——多媒体
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961649.html
Copyright © 2011-2022 走看看