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

      模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

    优点

      1、封装不变部分,扩展可变部分。
      2、提取公共部分代码,便于维护。
      3、行为控制交由子类来实现。(开闭原则)

    缺点

      按照我们设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法,但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。

    适用性

      1、多个子类有公有的方法,并且逻辑基本相同时。
      2、重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
      3、重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。

    实现

      根据模板方法模式的特点,假设一个应用场景,韩梅和李雷要去参加聚会,出门前要好好的打扮一下,韩梅需要化妆挑衣服,李雷则不需要化妆挑选好衣服后,就可以出门,现在来实现。类图如下:

    Human抽象类实现:

    package com.lidaming.design14.template;
    
    public abstract class Human {
        public boolean isGirl()
        {
            return false;
        }
        public abstract void dressUp();
        public abstract void chooseClothes();
        public void go()
        {
            if(isGirl())
            {
                dressUp();
            }
            chooseClothes();
            System.out.println("Ready?GO!");
        }
    }
    View Code

    HanMei的实现:

    package com.lidaming.design14.template;
    
    public class HanMei extends Human {
    
        @Override
        public boolean isGirl() {
            // TODO Auto-generated method stub
            return true;
        }
        @Override
        public void dressUp() {
            System.out.println("be a beauty");
    
        }
    
        @Override
        public void chooseClothes() {
            System.out.println("choose a beautiful dress");
        }
    
    }
    View Code

    LiLei的实现:

    package com.lidaming.design14.template;
    
    public class LiLei extends Human {
    
        @Override
        public boolean isGirl() {
            return false;
        }
    
        @Override
        public void dressUp() {
            System.out.println("boy need not dress up");
    
        }
    
        @Override
        public void chooseClothes() {
            System.out.println("choose a cool coat");
        }
    
    }
    View Code

    场景类的实现:

    package com.lidaming.design14.template;
    
    public class Client {
        public static void main(String[] args) {
            Human human = new HanMei();
            human.go();
            
            human=new LiLei();
            human.go();
        }
    }
    View Code

    参考:

    http://www.cnblogs.com/cbf4life/archive/2010/01/05/1639487.html
    http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html

  • 相关阅读:
    使用golang访问kubebernetes
    使用 Rancher 管理现有 Kubernetes 集群
    Running powershell scripts during nuget package installation and removal
    How to Create, Use, and Debug .NET application Crash Dumps in 2019
    寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目
    Selenium+Java之解决org.openqa.selenium.InvalidArgumentException: invalid argument报错问题
    Selenium环境搭建
    关于Xpath定位方法知道这些基本够用
    Web自动化之浏览器启动
    【翻译】编写代码注释的最佳实践
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5416526.html
Copyright © 2011-2022 走看看