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

    1、模式简介

    模版方法模式的定义:

      模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

    模版方法模式的优点:

    • 封装不变部分,扩展可变部分;
    • 提取公共代码,便于维护;
    • 行为由父类控制,子类实现。

    模版方法模式的缺点:

      每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

    模版方法模式的适用场景:

    • 当类中有多个子类共有的方法,且逻辑相同时;
    • 当有重要的、复杂的方法时,可以考虑作为模板方法。

    2、案例

      冲泡咖啡和冲泡茶叶都有相同的步骤:

    • 烧开水;
    • 冲泡;
    • 将咖啡/茶叶倒入到杯子中;
    • 加调料。

      因此,我们可以使用模版方法模式,将这些步骤提取出来作为模版使用。具体代码如下:

      制作饮料的抽象父类BeverageMaker,将烧水和倒入杯子的方法封装,冲泡和加调料的方法抽出作为接口方法。代码如下:

    public abstract class BeverageMaker {
    
        public final void makeBeverage() {
            boilWater();
            brew();
            putInCup();
            addCondiments();
        }
    
        // 烧水
        protected void boilWater() {
            System.out.println("烧水......");
        }
    
        // 冲泡
        protected abstract void brew();
    
        // 倒入到杯子中
        protected void putInCup() {
            System.out.println("倒入杯中......");
        }
    
        // 加调料
        protected abstract void addCondiments();
    }

      制作咖啡的方法类CoffeeMaker中的代码:

    public class CoffeeMaker extends BeverageMaker {
    
        @Override
        protected void brew() {
            System.out.println("冲泡咖啡......");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("添加牛奶......");
        }
    }

      制作茶的方法TeaMaker中的代码:

    public class TeaMaker extends BeverageMaker {
    
        @Override
        protected void brew() {
            System.out.println("冲泡茶叶......");
        }
    
        @Override
        protected void addCondiments() {
            System.out.println("添加柠檬......");
        }
    }

      测试类Test中的代码:

    public class Test {
        public static void main(String[] args) {
            System.out.println("制作咖啡的步骤如下:");
            BeverageMaker coffeeMaker = new CoffeeMaker();
            coffeeMaker.makeBeverage();
    
            System.out.println();
    
            System.out.println("制作茶叶的步骤如下:");
            BeverageMaker teaMaker = new TeaMaker();
            teaMaker.makeBeverage();
        }
    }

      运行结果如下图所示:



      下面贴出模版方法模式代码的GitHub地址:【GitHub - Template】

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/itgungnir/p/6211232.html
Copyright © 2011-2022 走看看