当前位置: 首页 > news >正文

设计模式② :交给子类

文章目录

  • 一、前言
  • 二、Template Method 模式
    • 1. 介绍
    • 2. 应用
    • 3. 总结
  • 三、Factory Method 模式
    • 1. 介绍
    • 2. 应用
    • 3. 总结
  • 参考内容

一、前言

有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》(【日】结城浩 著),内容仅用于个人学习记录,可随意转载。

二、Template Method 模式

Template Method 模式 :将具体处理交给子类

1. 介绍

在父类中定义处理流程框架,在子类中实现具体处理的模式就称为 Template Method 模式。

在 Template Method 模式 中登场的角色:

  • AbstractClass(抽象类):AbstractClass 角色不仅负责实现模板方法,还负责声明在模板方法中所使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。
  • ConcreteClass (具体类):该角色负责具体实现AbstractClass角色中定义的抽象方法。

类图如下, 抽象模板类会提供两个 methodA 、 methodB 两个抽象方法供子类实现,同时自身实现一个模板方法 templateMethod。在 templateMethod 方法中定义程序的行为,但行为的具体内容则是由子类实现:

在这里插入图片描述


Demo 如下:

	public abstract class AbstractClass {// 定义两个由子类实现的方法protected abstract void methodA();// 定义两个由子类实现的方法protected abstract void methodB();// 模板方法,在合适的场景可以将该方法定义为 final。// 模板类通过该方法定义了整个程序的行为,如下行为为:先调用 methodA 再调用 methodB// 对于子类则只需要关注 methodA 和 methodB 的具体实现,而不需要关注整个程序的行为。public void templateMethod() {methodA();methodB();}}// 子类只需要关注抽象方法的实现,而不需要关注整个调用过程public class StudentClass extends AbstractClass {@Overridepublic void methodA() {System.out.println("StudentClass.methodA");}@Overridepublic void methodB() {System.out.println("StudentClass.methodB");}}public class TeacherClass extends AbstractClass {@Overridepublic void methodA() {System.out.println("TeacherClass.methodA");}@Overridepublic void methodB() {System.out.println("TeacherClass.methodB");}}

2. 应用

Spring模板方法模式实质是模板方法模式和回调模式的结合,是Template Method不需要继承的另一种实现方式,如 JdbcTemplate、RedisTeplate、MongoTemplate 等。

这里我们以 JdbcTemplate为例,当我们调用 JdbcTemplate#execute 执行 Sql 时,JdbcTemplate#execute 流程是 DB 连接、Sql 执行、DB 释放,而我们实际只编写了Sql 部分,如下(下面代码仅作演示,真实代码并非如下)。

	private <T> T execute(String sql){// 1. 获取DB 连接以及其他预处理doDbConnect();// 2. Sql 执行executeSql(sql);// 3. 释放资源releaseDbConnection();}

可以看出 JdbcTemplate#execute 作为一个 Template Method 通过完成了 DB 连接与释放的功能。但实际上 Spring几乎所有的外接扩展都采用回调模式模式来执行。如下, 通过 callback 回调来执行具体的业务逻辑:

    public final Object execute(StatementCallback callback){    Connection con=null;    Statement stmt=null;    try {    con=getConnection();    stmt=con.createStatement();    Object retValue=callback.doWithStatement(stmt);    return retValue;    } catchSQLException e){    ...    } finally{    closeStatement(stmt);    releaseConnection(con);    }    }  

JDBC的抽象和对Hibernate的集成,都采用了一种理念或者处理方式,那就是模板方法模式与相应的Callback接口相结合。



个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑)

  • 项目A中,需要根据通道的不同构建不同的数据集,便使用了如下的模板模式,不同的通道实现各自的模板类,其中 DataHead 和 DataDetail 可以通过继承的方式进行各个通道的数据扩展。通过 DataTemplate#getFinalData 获取最终的数据集。

    // 抽象模板方法,供不同通道的子类实现
    public abstract class DataTemplate {/*** 获取头数据* @return*/protected abstract DataHead getDataHead();/*** 获取详细数据* @return*/protected abstract List<DataDetail> getDataDetail();/*** 获取最终的数据集* @return*/public FinalData getFinalData() {final FinalData finalData = new FinalData();finalData.setDataHead(getDataHead());finalData.setDataDetailList(getDataDetail());return finalData;}
    }
    
  1. 项目B中,需要对客户资料进行解析,资料固定是一个 PDF、一个 Excel 文件,需要对两个文件中的数据解析并汇总处理,而可能存在的情况是PDF 和 Excel 存在多套格式。即可以定义出来一个 FileTemplate ,不同格式的 PDF 和 Excel 实现不同的 FileTemplate ,最终完成多种模板格式的解析(可以通过策略模式对每一种不同的格式的文件实现单独的解析策略,进一步解耦)

    public abstract class FileTemplate {/*** 获取头数据* @return*/protected abstract PdfData getPdfData();/*** 获取详细数据* @return*/protected abstract ExcelData getExcelData();/*** 获取最终的数据集* @return*/public FileData getFinalData() {final FileData finalData = new FileData();finalData.setPdfData(getPdfData());finalData.setExcelData(getExcelData());return finalData;}
    }
    

3. 总结

在 Template Method 模式中,可以使用继承(实现)改变程序的行为。这是因为 Template Method 模式在父类中定义程序行为的框架,在子类中决定具体的处理。在该模式中,处理的流程被定义在父类中,而具体的处理则交给了子类。

在 Strategy 模式中,可以使用委托改变程序的行为。与 Template Method 模式中改变部分程序行为不同的是, Strategy 模式用于替换整个算法。


相关设计模式:

  • Factory Method 模式:Factory Method 模式是将 Template Method 模式用于生成实例的一个典型例子。
  • Strategy 模式:在 Template Method 模式中,可以使用继承(实现)改变程序的行为。这是因为 Template Method 模式在父类中定义程序行为的框架,在子类中决定具体的处理。在该模式中,处理的流程被定义在父类中,而具体的处理则交给了子类。而在 Strategy 模式中,他可以使用委托改变程序的行为。与 Template Method 中改变部分程序行为不同的是,Strategy 模式用于替换整个算法

三、Factory Method 模式

Factory Method 模式 :将实例的生成交给子类。

1. 介绍

Template Method 模式在父类中定义程序行为的框架,在子类中决定具体的处理。如果将该模式用于生成实例,那么他将演变成 Factory Method 模式。在该模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体的处理全部交给子类负责。这样就可以将生成实例的框架和实际负责生成实例的类解耦。


Factory Method 模式中登场的角色

  • Product (产品):Product 属于框架这一方,是一个抽象类。它定义了在 Factory Method 模式中生成的那些实例所持有的接口 (API),但具体的处理则由子类角色决定。
  • Creator (创建者):Creator 属于框架这一方,它是负责生成 Product 角色的抽象类,但具体的处理规则由子类角色决定。Creator 角色对于实际负责生成实例的ConcreteCreator角色一无所知,它唯一知道的就是只要调用 Product 角色和生成实例的方法就可以生成 Product 的实例。
  • ConcreteProduct (具体的产品):ConcreteProduct 属于具体的加工者一方,它决定了具体的产品。
  • ConcreteCreator(具体的创建者):ConcreteCreator 属于具体的加工者一方,它负责生产具体的产品。

类图如下:我们可以得知父类(框架)这一方面的角色的关系与子类(具体加工)这一方面的角色关系是平行的。这里Creator 定义了 create 方法用于创建(生产) Product 实例,同时 factoryMethod 则是该工厂类的其他工厂方法,具体需要根据业务去定义。

在这里插入图片描述


Demo 如下:

	public abstract class Creator {// create 方法用于创建 具体 Product,并可以执行其他逻辑,如 调用registerProduct方法实现注册功能等(具体看业务需求)public final Product create(){final Product product = createProduct();registerProduct(product);return product;}// 下面是 factoryMethod 方法// 使用 createProduct 创建 Product,目的是父类与子类解耦。protected abstract Product createProduct();// 注册产品protected abstract void registerProduct(Product product);}public abstract class Product {// 随意定义的两个 方法public abstract void methodA();public abstract void methodB();}public class ConcreteCreator extends Creator{// 实现 factoryMethod, 根据业务需要可以有不同的实现@Overrideprotected Product createProduct() {return new ConcreteProduct();}// 根据业务需要进行实现,这里随意调用了 Product 的两个方法@Overrideprotected void registerProduct(Product product) {product.methodA();product.methodB();}}public class ConcreteProduct extends Product {@Overridepublic void methodA() {System.out.println("ConcreteProduct.methodA");}@Overridepublic void methodB() {System.out.println("ConcreteProduct.methodB");}}// 用于测试的 Main 方法public class FactoryMethodMain {public static void main(String[] args) {// 实际场景下  Creator 应该有多个实现类,而在这种情况下可以使用工厂模式或简单工厂模式来获取 Creator 实例。Creator creator = new ConcreteCreator();// 调用模板方法创建具体实例final Product product = creator.create();// TODO : do something}}

2. 应用

  • Spring 框架支持通过 factory-bean 和 factory-method 属性的方式来指定工厂方法来创建Bean。如下指定 DesignConfig#designDemo 的方法来创建 DesignDemo 并注册到容器中,在指定的 factory-method 方法中可以实现自定义的逻辑:

    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="designConfig" class="com.kingfish.pojo.config.DesignConfig"/><bean id="designDemo" class="com.kingfish.pojo.DesignDemo" factory-bean="designConfig" factory-method="designDemo"/></beans>
    


个人使用:该部分内容是写给自己看的,帮助自身理解,因此就不交代项目背景了,读者请自行忽略(◐ˍ◑)

  • 项目A中,不同的 Region 都会获取相同的数据,但数据来源以及拼接不同,因此计划在服务启动或在其他触发条件下,生成一个 RegionContent 类,可以作为上下文或者其他的数据,不同 Region 进行具体实现,根据 Region 的不同加载不同的 RegionContent 实例来获取对应的全局数据。如下:

    /*** 顶层定义一个 Creator 接口*/
    public interface ContextCreator {RegionContent createContext();
    }// 定义一个 Region Creator 的抽象类,用于创建 RegionContent 
    public abstract class RegionContentCreator implements ContextCreator {@Overridepublic final RegionContent createContext() {final RegionContent regionContent = doCreateContent();postProcess(regionContent);return regionContent;}// 创建方法protected abstract RegionContent doCreateContent();// 后置处理,在 RegionContent 创建的后置处理 - 需要的话可以实现protected abstract void postProcess(RegionContent regionContent);
    }// SH  Region的实现
    @Slf4j
    public class ShRegionContentCreator extends RegionContentCreator {@Overrideprotected RegionContent doCreateContent() {return new ShRegionContext();}@Overrideprotected void postProcess(RegionContent regionContent) {log.info("[region 后期处理][regionContext = {}]", regionContent);}
    }// RegionContent 接口定义
    public interface RegionContent {/*** 返回 region 标识* @return*/String getRegion();/*** 获取关区内容* @return 懒得定义实现类,所以返回 Object*/Object getContent();
    }// SH RegionContent 的实现
    public class ShRegionContext implements RegionContent {@Overridepublic String getRegion() {// 应该用全局变量或者枚举return "sh";}@Overridepublic Object getContent() {// 随便返回return "这里是 SH Region 的 Content";}
    }@Slf4j
    public class DemoMain {public static void main(String[] args) {// 创建 RegionContent 。实际业务会有多个 RegionContentCreator, 可以根据环境或者参数加载RegionContentCreator regionContentCreator = new ShRegionContentCreator();final RegionContent content = regionContentCreator.createContext();// 随便打印log.info("region = {}, regionContent = {}", content.getRegion(), content.getContent());}
    }
    

3. 总结

相关的设计模式:

  • Template Method 模式:Factory Method 模式是 Template Method 的典型应用
  • Singleton 模式:多数情况下 Singleton 模式用于扮演 Creator 角色 或者 ConcreteCreator 橘色的类,这是因为在程序中没有必要存在多个Creator 或 ConcreteCreator 角色的实例。
  • Composite 模式:有时候可以将 Composite 模式用于 Product 或 ConcreteProduct 角色。
  • Iterator 模式:有时在 Iterator 模式中使用 iterator 方法生成 Iterator 的实例时会使用 Factory Method。

参考内容

https://mp.weixin.qq.com/s/JUV4cnE_HqRMFriKMHk0Ug

相关文章:

设计模式② :交给子类

文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书&qu…...

Hive 源码

hive 编译 issue Failed to execute goal com.github.os72:protoc-jar-maven-plugin:3.5.1.1:run (default) on project hive-standalone-metastore: Error resolving artifact: com.google.protobuf:protoc:2.5.0: The following artifacts could not be resolved: com.goog…...

调整几行代码,接口吞吐提升 10 倍,性能调优妙啊!

景 分析过程 总结 背景 公司的一个ToB系统,因为客户使用的也不多,没啥并发要求,就一直没有经过压测。这两天来了一个“大客户”,对并发量提出了要求:核心接口与几个重点使用场景单节点吞吐量要满足最低500/s的要求。 当时一想,500/s吞吐量还不简单。Tomcat按照100个线程…...

MACOS Atrust服务异常

MAC版Atrust服务异常 点击进入办公后出现提示其一&#xff1a; 核心服务未启动&#xff0c;部分功能存在异常&#xff0c;确定重新启动吗&#xff1f; 可能的原因&#xff1a; 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后&#xff0c;出现提示&#x…...

LLM大语言模型(四):在ChatGLM3-6B中使用langchain

目录 背景准备工作工具添加LangChain 已实现工具Calculator、Weather Tool配置 自定义工具自定义kuakuawo Agent 多工具使用参考 背景 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使应用程序能够: 具有上下文意识&#xff1a;将语言模型与上下文源(提示指令&…...

Dubbo入门介绍和实战

1. 引言 Dubbo是一款开源的高性能、轻量级的Java RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;旨在解决分布式服务之间的通信问题。本文将介绍Dubbo的基础概念、核心特性以及使用场景&#xff0c;包括实际示例演示。 2. 什么是Dubbo&#xff1f; Dubbo是阿里巴…...

如何实现无人机识别功能

无人机识别算法可以基于不同的传感器和技术&#xff0c;结合多种方法进行实现。以下是一些常见的无人机识别算法和技术&#xff1a; 视觉识别&#xff1a; 图像处理&#xff1a; 使用计算机视觉技术对无人机图像进行处理&#xff0c;包括特征提取、目标检测和跟踪等。深度学习&…...

Python学习笔记(四)流程控制方法

流程控制有三种方法&#xff1a;分支、循环、跳出 流程的控制通过布尔值来实现&#xff0c;分支和循环都需要对一定的条件进行判断&#xff0c;根据判断结果&#xff08;布尔值&#xff09;决定下一步要做什么 布尔值通过比较运算符、逻辑运算符来进行判断是True还是False 不…...

【Qt- C++ Qml 交互】

Qt编程指南 VX&#xff1a;hao541022348 ■ 将C对象注册到 QML中&#xff0c;在QML使用C对象■ C对象注册到元对象系统■ Q_INVOKABLE 宏定义是将C 的 函数&#xff08;方法&#xff09;声明为元对象系统可调用的函数■ 演示步骤 ■ 将 C类注册到 QML&#xff0c;并在QML声明一…...

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本&#xff0c;执行 python 时&#xff0c;默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…...

程序性能优化全能手册

本文聊一个程序员都会关注的问题&#xff1a;性能。 当大家谈到“性能”时&#xff0c;你首先想到的会是什么&#xff1f; 是每次请求需要多长时间才能返回&#xff1f; 是每秒钟能够处理多少次请求&#xff1f; 还是程序的CPU和内存使用率高不高&#xff1f; 这些问题基本上…...

LiveSIPB流媒体国网B接口功能-国网B接口服务安装使用说明

LiveSIPB 国网B接口服务安装使用说明 1、服务说明1.1、安装包说明1.2、国网B接口信令服务1.3、国网B接口流媒体服务1.4、配置信令服务(LiveCMS)1.5、配置流媒体服务(LiveSMS) 2、服务运行2.1、Windows2.2、Linux 3、配置设备接入3.1、海康STATE_GRID接入示例 4、平台使用4.1、管…...

利用小红书笔记详情API:为内容运营提供强大的支持

利用小红书笔记详情API&#xff0c;内容运营者可以获得对小红书平台上的笔记内容的深入洞察&#xff0c;从而为其运营工作提供强大的支持。以下是该API如何支持内容运营的几个关键方面&#xff1a; 获取笔记内容与数据&#xff1a; API允许内容运营者直接获取小红书平台上的笔记…...

地理空间分析1——入门Python地理空间分析

写在开头 地理空间分析是一门涉及地球表面数据处理和解释的科学&#xff0c;通过对地理现象的研究&#xff0c;我们可以更深入地了解地球各个角落的关系。Python作为一种功能强大的编程语言&#xff0c;在地理空间分析领域展现了强大的潜力。本文将带您深入了解入门级别的Pyth…...

哈尔滨爆火的背后有什么值得我们学习的,2024普通人如何创业/2024风口行业

这个冬天&#xff0c;“南方小土豆”带火东北冰雪游。“冰城”黑龙江哈尔滨的文旅市场异常火爆&#xff0c;元旦假期3天&#xff0c;哈尔滨市累计接待游客304.79万人次&#xff0c;实现旅游总收入59.14亿元。旅游总收入达到历史峰值。哈尔滨旅游怎么就爆火了&#xff1f;背后究…...

element中Tree 树形控件实现多选、展开折叠、全选全不选、父子联动、默认展开、默认选中、默认禁用、自定义节点内容、可拖拽节点、手风琴模式

目录 1.代码实现2. 效果图3. 使用到的部分属性说明4. 更多属性配置查看element官网 1.代码实现 <template><div class"TreePage"><el-checkboxv-model"menuExpand"change"handleCheckedTreeExpand($event, menu)">展开/折叠&l…...

数据结构OJ实验15-插入排序与交换排序

A. DS内排—直插排序 题目描述 给定一组数据&#xff0c;使用直插排序完成数据的升序排序。 --程序要求-- 若使用C只能include一个头文件iostream&#xff1b;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件&#xff0c;不看代码&#xff0c;作0分…...

鹿目标检测数据集VOC格式500张

鹿&#xff0c;一种优雅而神秘的哺乳动物&#xff0c;以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等&#xff0c;四肢细长&#xff0c;身体线条流畅。它们的头部较小&#xff0c;耳朵大而直立&#xff0c;眼睛明亮有神。鹿的毛色因品种而异&#xff0c;…...

静态网页设计——电影推荐网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1NK411x7oK/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…...

ARM CCA机密计算架构软件栈简介

本博客描述了Arm机密计算架构(Arm CCA)的固件和软件组件。 在这篇博客中,您将学到如何: 列出组成Arm CCA软件栈的组件集了解Arm CCA引入新软件组件的原因了解监视器和领域管理监视器(RMM)的角色了解如何创建和管理领域1.1 开始之前 我们假设您熟悉AArch64异常模型、AAr…...

C#编程-使用集合

使用集合 您学习了如何使用数组来有效地存储和操作相似类型额数据。但是,以下限制于数组的使用相关联: 您必须在声明时定义数组的大小。您必须编写代码以对数组执行标准操作,如排序。让我们思考一个示例。假设您想要存储在组织工作的五个雇员的姓名。您可以使用以下语句来声…...

linux 设备模型之设备

在最低层, Linux 系统中的每个设备由一个 struct device 代表: struct device { struct device *parent; struct kobject kobj; char bus_id[BUS_ID_SIZE]; struct bus_type *bus; struct device_driver *driver; void *driver_data; void (*release)(struct device *dev); /* …...

电源滤波可采用 RC、LC、π 型滤波。电源滤波建议优选磁珠,然后才是电感。同时电阻、电感和磁珠必须考虑其电阻产生的压降。

电源滤波是为了减少电源中的噪声和干扰,确保电子设备正常工作。RC、LC、π 型滤波是常用的电源滤波器结构,其选择主要取决于需要滤波的频率范围和所需的滤波效果。 RC滤波器是由电阻和电容组成,适用于高频噪声的滤波。当电流通过电容时,电容会阻止高频噪声信号的通过,起到…...

STM32通用定时器-输入捕获-脉冲计数

一、知识点 编码器   两相编码器&#xff08;正交编码器&#xff09;&#xff1a;两相编码器由 A 相和 B 相组成&#xff0c;相位差为 90 度。当旋转方向为顺时针时&#xff0c;A 相先变化&#xff0c;然后 B 相变化&#xff1b;当旋转方向为逆时针时&#xff0c;B 相先变化…...

Flutter GetX 之 路由管理

路由管理是插件GetX常用功能之一&#xff0c;为什么说之一呢&#xff1f;因为GetX的功能远不止路由管理这么简单。 GetX的重要功能如下&#xff1a; 1、路由管理2、状态管理3、国际化4、主题5、GetUtil工具6、dialog 弹框7、snackbar 其实上面功能介绍的还是不够详细&#xff…...

基于单片机的农田灌溉系统(论文+源码)

1.系统设计 本系统主要实现如下目标&#xff1a; 1&#xff0e;可以实时监测土壤湿度&#xff1b; 2&#xff0e;土壤湿度太低时&#xff0c;进行浇水操作&#xff1b; 3&#xff0e;可以按键设置湿度的触发阈值&#xff1b; 4. 可以实现远程操控 5&#xff0e;可以实现手…...

分布式缓存 -- 基础

负载均衡 Ribbon 服务间通信的负载均衡工具&#xff0c;提供完善的超时重试机制 客户端的负载均衡器&#xff1a;在客户端将各个服务的信息拿到&#xff0c;在客户端本地做到请求的均衡分配 Ribbon 提供 LoadBalanced 注解&#xff0c;外搭配RestTemplate来做客户端的负载均衡…...

云计算复习笔记--期末

1、云计算的定义和本质&#xff1a; 云计算是一种按使用量付费的模式。云计算是分布式计算的一种。通过计算机网络&#xff08;多指因特网&#xff09;形成的计算能力极强的系统&#xff0c;可存储、集合相关资源并可按需配置&#xff0c;向用户提供个性化服务。 2、云计算服…...

【WPF.NET开发】WPF中的焦点

本文内容 键盘焦点逻辑焦点键盘导航以编程方式导航焦点焦点事件 在 WPF 中&#xff0c;有两个与焦点有关的主要概念&#xff1a;键盘焦点和逻辑焦点。 键盘焦点指接收键盘输入的元素&#xff0c;而逻辑焦点指焦点范围中具有焦点的元素。 本概述详细介绍了这些概念。 对于创建…...

【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】

文章目录 一.【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】1.1 项目主题:豆瓣电影二.代码剖析2.1 项目效果展示2.2 服务端代码剖析2.3 数据分析2.4 数据评分三.寄语四.本案例完整源码下载一.【计算机设计大赛作品】豆瓣…...

郑州个人做网站汉狮/如何做推广宣传

c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言是进入编程世…...

国内手机app开发公司/长沙网站推广seo

Android-View的手势分发 2016-05-08 23:26 862人阅读 评论(2) 收藏 举报 本文章已收录于&#xff1a; 分类&#xff1a; Android知识框架-中级&#xff08;15&#xff09; 作者同类文章X版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?…...

bootstrap网页模板源码/优化网站的步骤

Html基础知识点整理基本标签字体标签格式化标签1. < br/ >2. < p > < /p >3. < h1 > < /h1 >4. & nbspHtml的注释图片标签1. < img/ >列表标签1. < ul > < /ul >2. < li > < /li >3. < ol > < /ol &…...

wordpress third主题/最权威的排行榜网站

1、谈理想&#xff1a;希望公司对人类社会进步有贡献 我们希望阿里巴巴是这么一家公司&#xff0c;希望在中国这个土地上诞生一家对世界经济发展、人类社会进步有贡献的公司。所以我们希望招聘进来的员工&#xff0c;大家都充满这个使命&#xff0c;大家都充满着这个理想&…...

网站开发深/微信视频号怎么推广引流

#每天一点点# python 面向对象编程 隐藏属性 目的&#xff1a;以后定义属性是&#xff0c;尽量不要让外界随便用&#xff0c;而是定义一个方法&#xff0c;在方法中对属性进行检查 不隐藏属性 class Dog:#定义一个狗狗类def set_age(self):pass dog Dog() dog.age -10 #不…...

网站建设里面链接打不开/免费的郑州网络推广服务

实战需求 SwiftUI macos 教程之如何设置TextView行间距 参考代码 let myStyle NSMutableParagraphStyle()myStyle.lineSpacing 10.0textView.defaultParagraphStyle myStyle加入我们一起学习SwiftUI QQ:3365059189 SwiftUI技术交流QQ群:518696470...