首页 > 其他分享 >模板方法模式

模板方法模式

时间:2023-06-01 11:23:57浏览次数:29  
标签:Console AnimalToFridge 子类 void 模式 protected WriteLine 方法 模板

一、定义

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

二、实例

来一个经典的脑筋急转弯。

  1. 把一个大象装进冰箱要几个步骤?
  2. 然后把一个长颈鹿装进冰箱要几个步骤?

三、UML类图

  

四、钩子函数

钩子就是给子类一个授权,让子类来可重定义模板方法的某些步骤,说白了就是虚函数。

五、优缺点

优点

  • 封装了算法骨架,提高了代码复用性,简化了使用难度;
  • 封装不变部分,扩展可变部分,满足开闭原则。

缺点

  • 算法骨架不易更改;
  • 扩展时,可能会产生很多子类。

六、代码

1.AnimalToFridge.cs

public abstract class AnimalToFridge
    {
        public void Do()
        {
            OpenFridge();

            BeforePutIntoFridge();

            PutIntoFridge();

            CloseFridge();
        }

        private void OpenFridge()
        {
            Console.WriteLine("把冰箱门打开");
        }

        protected virtual void BeforePutIntoFridge() {           
        }

        protected abstract void PutIntoFridge();

        private void CloseFridge()
        {
            Console.WriteLine("把冰箱门关上");
        }
    }

2.ElephantToFridge.cs

 public class ElephantToFridge : AnimalToFridge
    {
        protected override void PutIntoFridge()
        {
            Console.WriteLine("把大象放进去");
        }
    }

3.GiraffeToFridge.cs

public class GiraffeToFridge : AnimalToFridge
    {
        protected override void BeforePutIntoFridge()
        {
            Console.WriteLine("把大象弄出来");
        }

        protected override void PutIntoFridge()
        {
            Console.WriteLine("把长颈鹿放进去");
        }
    }

4.Program.cs

internal class Program
    {
        static void Main(string[] args)
        {
            AnimalToFridge elephant = new ElephantToFridge();
            elephant.Do();
            Console.WriteLine("--------------");
            AnimalToFridge giraffe = new GiraffeToFridge();
            giraffe.Do();
        }
    }

运行结果:

 

标签:Console,AnimalToFridge,子类,void,模式,protected,WriteLine,方法,模板
From: https://www.cnblogs.com/xiao-wo-niu/p/17448435.html

相关文章

  • FTP搭建及内网穿透(Windows环境)、两种(主动、被动)模式
    有两种方法一、使用IIS搭建FTP需要注意的是被动端口设置完后要重启一下【MicrosoftFTPService】服务才能生效Windows系统IIS搭建FTP服务如何配置被动端口?1、打开IIS管理器,点击左侧的服务器,进入服务器设置主页找到 FTP功能 中的 FTP防火墙支持 点击进入2、在数据通道端......
  • vue+docxtemplater,填充word模板
    安装依赖yarnadddocxtemplateryarnaddpizzipyarnaddjszip-utilsyarnaddfile-saver//模板解析插件(支持list循环直接使用$index,使用if判断语法)yarnaddangular-expressionsyarnaddlodash页面测试代码<template> <div> <button@click="bt......
  • Go设计模式
    Go-设计模式整理参考:Go设计模式24-总结(更新完毕)-Mohuishou(lailin.xyz)go设计模式实现,包含23种常见的设计模式实现设计模式学习的重点是什么?设计原则,以及设计模式的使用场景和优缺点,实现相对来说还没有那么重要如果是常见的设计模式是武术招式,那么设计原则就是内......
  • 【Python】【Flask】前端调用后端方法
    后端代码:@app.route("/test",methods=['POST','GET'])deftest():return"我是测试的"前端代码:1、使用<a>标签<ahref="{{url_for('test')}}">我是测试</a>这个是最简单的,点击一下,就自动跳转了。2、使用<button>......
  • 上传照片方法
     //chooseImage.jsfunctionupdateElementStyle(element,styles){for(constattrNameinstyles){element.style[attrName]=styles[attrName]}}constALL='*'functionisWXEnv(){constua=window.navigator.userAgent.toLowerCas......
  • 启动HBase时提示SLF4J: Class path contains multiple SLF4J bindings的解决方法
    启动hbase报错:“SLF4J:ClasspathcontainsmultipleSLF4Jbindings.”解决方法cd/home/opt/hbase-2.2.3/lib/client-facing-thirdpartymvslf4j-log4j12-1.7.25.jarslf4j-log4j12-1.7.25-copy修改了hbase中的文件名,保留了hadoop的,这个会有问题,一个当启动hbase的reg会报错这......
  • Python判断一个数据结构是否为空的方法
    《EffectivePython》,里面提到判断字符串或者集合是否为空的原则。意思是:不要通过取字符串或者集合的长度来判断是否为空,而是要用not关键字来判断,因为当字符串或集合为空时,其值被隐式地赋为False.test_str=''test_tuple=()test_list=[]test_dict={}test_set=set()ifnot(test......
  • 命令模式学习
    命令模式通过将请求封装成Command对象实现了请求的调用者和请求的执行者之间的解耦,并且可以很方便的实现请求排队,日志记录,命令撤销等操作。这里边比较经典的一个功能就是通过命令模式可以把已经执行的命令记录下来,轻松的实现命令的回退,重做这些操作,类似在文本编辑器中的操作......
  • Js 常见数据类型及判断方法及手写深拷贝
    常见值类型:undefined、String、Number、boolean、Symbol.常见 引用类型:Array、Object、function(特殊引用类型,单不用于存储数据,所以 “没有拷贝、复制函数” 这说法)、null(特殊引用类型,指针指向为空地址)判断数据类型的方法:typeof运算符leta;conststring='abc......
  • Razor Pages本地IIS服务器部署流程及部分问题解决方法
     记录一下自己在本地IIS服务器部署的基本流程:添加IIS服务器控制面板>>程序和功能 启用或关闭windows功能>>勾选相关功能   网站部署将项目发布(publish)至本地文件夹:在包含.sln文件的目录下打开终端,输入dotnetpublish-cdebug--no-self-contained......