自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 资源 (1)
  • 收藏
  • 关注

原创 自定义ViewGroup--实现FlowLayout

自定义ViewGroup–实现FlowLayout基本流程0.自定义容器类继承ViewGroup需要实现4个构造函数public class FlowLayout extends ViewGroup { // 子View二维列表 List<List<View>> allChild = new ArrayList<>(); // 每行的高度,取每行的最大值 List<Integer> itemHeightList = ne

2021-09-14 19:12:38 132

原创 Git常用命令

Git常用命令一. 基本概念工作区:存放代码的目录暂存区:存放临时改动git仓库:包含所有已经提交的数据通常的工作流程为:在工作区中添加修改文件(绿色是新添加,红色是已修改),目前状态为已修改(modified);如果暂时不想提交的代码可以存进暂存区,被add的文件都会进入暂存区,暂存区内的文件是会被git追踪的。此时为已暂存(staged);暂存区记录的是对文件的修改,只要是add过的文件,任何修改只要保存了都会添加进暂存区。修改完成后提交代码之,代码进入仓库,此时状态为已提交(comm

2021-09-01 18:25:39 126

原创 一文搞懂Tomcat使用

Tomcat使用简介1.安装选择所用版本,下载地址 https://tomcat.apache.org/ ,下载后解压到指定目录下。新建环境变量:CATALINA_HOME = D:\Program Files\apache-tomcat-7.0.99在Path中添加:%CATALINA_HOME%\bin保存后新开cmd ,输入startup.bat 启动服务器,浏览器打开http://127.0.0.1:8080/即可看到Tomcat网页。2.Tomcat目录结构Tomcat的顶层目录如

2021-09-01 13:50:43 220

原创 Android项目构建Gradle脚本解析

Android项目构建Gradle脚本解析1.项目整体目录build.gradle一个Android项目首先在根目录有一个build.gradle脚本,这个脚本负责 项目中所有模块的构建配置 ,主要配置 项目中所有模块共用的 Gradle 代码库和依赖项 。// 引入自定义的配置脚本apply from: "version.gradle" // buildscript定义项目构建的仓库和依赖项buildscript { // 依赖仓库,包含本地仓库和远程仓库 repo

2021-09-01 13:49:56 833

原创 桥接器模式

桥接器模式桥接器起着连接两边的作用,将抽象部分和实现部分分离,使它们都可以独立的进行变化。让类的功能层次和实现层次相分离,使两者能独立变化,在两者之间搭建桥梁,实现桥接。如果一个事物有多个维度的属性,我们该如果表示因这些维度不同而衍生出的多种不同的类呢?如果是使用继承的方式,每多一个维度,由于是乘数关系,会导致类数量爆炸。用图形的表示类举例,我们的图形有四种形状,三种颜色,如果要表示所有的状态的图形,使用继承的方式就得要12种类来。如下图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存

2021-08-24 14:50:39 149

转载 MySQL 50道题

MySQL 50道题最近学了下MySql,准备学习下这50道题,留作记录。注意:MySQL5.7以后会默认开启sql_mode=only_full_group_by,会导致group by 操作时select 后只能跟group by 之后的字段,可以使用select @@sql_mode查询。win10系统下,找到MySQL安装目录,修改my.ini文件,在[mysqld]之后配置sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE

2021-08-24 14:50:03 150

原创 使用Visual Studio Code来配置C++编译环境

使用Visual Studio Code来配置C++编译环境1.下载安装vscode,官方地址https://code.visualstudio.com下载安装后,使用快捷键Ctrl+Shift+x 打开插件安装器,安装C/C++ extension for VS Code调试插件2.安装本地编译环境安装TDM-GCC 10.3.0 release,下载地址为https://jmeubank.github.io/tdm-gcc/按照默认配置进行安装,会自动将安装目录添加的环境变量中,如:D:\

2021-08-22 15:14:11 427

原创 Dart中的Stream

简介:Stream是一个异步的事件队列,常见的同步的队列会提供迭代接口让你在外部循环中从队列中拿到一个事件并处理。这得基于你的事件队列里面已经有一些待处理的事件,处理事件的节奏是由外部循环控制的。当你不知道下一个事件什么时候会发生时,就可以对这个队列设定一个监听,当有事件发生的时由队列来调用预先的处理程序。其实就是 一个观察者模型当处理事件的时候是否要切换线程?队列支持单个订阅者还是多个订阅者?1.创建流...

2021-08-18 21:32:58 1233

原创 Flutter常用命令

jsonflutter pub run build_runner build --delete-conflicting-outputs安装包flutter pub add url_launcher

2021-08-18 21:32:33 537

原创 Dagger2 使用

Dagger2 使用Dagger2是一款基于Java注解来实现的完全在编译阶段完成依赖注入的开源库,主要用于模块间解耦、提高代码的健壮性和可维护性。Dagger2在编译阶段通过apt利用Java注解自动生成Java代码,然后结合手写的代码来自动帮我们完成依赖注入的工作。1. 依赖倒置依赖倒置原则(Dependence Inversion Principle),程序要依赖抽象,而不是依赖具体实现。A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体,具体应该依赖于

2021-08-18 21:32:03 105

原创 Gradle学习

Gradle学习第一章:Gradle 入门1. 环境搭建基础环境为Ubuntu16.04java 安装sudo apt install openjdk-8-jdkgradle安装在官网下载安装包解压到安装目录,在用户目录下.bashrc 文件中或者/etc/profile中添加环境变量配置。GRADLE_HOME=/root/UbuntuHome/gradle-2.14PATH=${PATH}:${GRADLE_HOME}/binexport GRADLE_HOME PATH在sh

2021-08-12 13:53:07 340

原创 设计模式--模板方法模式

模板方法模式定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。1.使用场景定义一个算法骨架,规定好具体执行流程,但每个步骤可以留作抽象方法,留给子类来实现。在重构时,将相同的代码抽取到父类中,通过钩子函数约束其行为。2.角色AbsTemplate 抽象类,定义了一套算法框架ConcreteA 具体实现类A3.实践// 抽象模板public abstract class AbstractComputer { pr

2021-08-12 13:51:38 49

原创 设计模式--策略模式

策略模式策略模式和状态模式很相似,但策略模式中的策略是一系列相似的算法(相似指,输入参数类型一致,输出参数类型一致),将算法封装后,通过注入的方式实现算法的切换。让算法实现独立于客户端而变化。1. 使用场景如果同一类型的问题有多重解决办法,仅仅是具体行为有差别,则可以通过策略模式来动态改变,具体解决方案。2. 角色Context 所谓上下文环境,就是行为主题,通过给山下文注入不同策略来更换具体策略实现。Strategy 抽象策略类ConcreteStrategy 具体策略实现3. 实践

2021-08-12 13:51:01 55

原创 设计模式--状态模式

状态模式类对象的状态不同,则相同行为(同名方法)的具体实现不同;在外部看来,一个对象会因为状态不同,相同的行为会有不同的表现。状态决定行为,状态不同则行为不同。1. 使用场景当一个对象的行为需要跟随运行时状态的改变而发生变化时,可使用该模式。当代码中有大量与状态相关的条件语句(if else switch-case),举个例子,一个运动员有不正常状态,正常状态,超常状态,对于投篮这个动作,不同状态会有不同的表现,不仅如此,吃饭、睡觉、训练都有不同的表现,投篮(){if(正常状态){ 正常状态

2021-08-12 13:50:22 69

转载 设计模式--观察者模式

观察者模式该模式下被观察者和观察者对象形成一对多的关系,当被观察者发生改变时,所有的观察者都会接收到通知。1. 使用场景当一个对象的改变需要通知给其他对象,而又不知道其他对象是谁、有多少。2. 角色Subject 抽象主题,被观察者(Observable),使用集合存储所有抽象观察者,并提供增加删除观察者的方法。ConcreteSubject 具体主题,具体被观察者,实现了给具体观察者通知状态改变的逻辑。Observer 抽象观察者,定义了在得到通知后进行更新的接口方法。ConcreteO

2021-08-12 13:49:33 41

原创 设计模式--备忘录模式

备忘录模式用于在不破坏对象封装(保持所有属性为私有状态,不提供对外访问方法)的情况下,捕获一个对象的状态,并在该对象之外保存状态。1. 使用场景需要保存一个对象在某一时刻的状态或部分状态。2. 角色Originator 需要保存状态的对象,可以创建备忘录,记录并恢复自身状态。Memento 备忘录角色,存储了Originator对象,防止其他对象访问OriginatorCaretaker 负责存储备忘录对象,不能对备忘录的内容进行操作和处理3. 实践// Originator类,pu

2021-08-12 13:48:52 58

原创 设计模式--中介者模式

中介者模式中介者模式包装了多个对象之间的一系列交互,使的对象之间耦合松散,对象不用再持有其他对象的引用,多个对象之间相互调用形成的网状结构(多对多),可以变为围绕着中介者形成的星型结构(一对多)。一个对象的修改不会影响其他对象的调用。1. 使用场景一组对象之间需要进行复杂的交互,或想通过一个中介者来封装多个类中的行为,而又不想生成太多的子类。2. 角色Mediator 抽象中介者,定义了同事对象到交互对象的接口。ConcreteMediator 具体中介者角色,继承抽象中介者,负责接收同事发

2021-08-12 13:48:10 48

原创 设计模式--迭代器模式

迭代器模式也称为游标模式,用于顺序访问集合对象的元素,如java中List、Map、数组等。如果由容器提供遍历访问,则容器类承担了太多功能,如果让用户在外部实现遍历,则需要把容器内部的实现细节暴露出去。 使用迭代器可以解决上述问题。1. 使用场景顺序遍历容器对象时使用。2. 角色Iterator 迭代器接口,定义了访问和遍历元素的接口方法。Concrete Iterator 具体迭代器类,实现迭代器类,记录遍历的当前位置。Aggregate 聚合容器接口,定义了创建和对外提供具体迭代器的接口

2021-08-12 13:47:32 51

原创 设计模式--责任链模式

责任链模式将多个处理者穿成一条链,使得每个处理者都有机会进行事件处理。 事件对象沿着责任链依次向下传递,直到有处理者处理它为止。1. 适用场景多个处理者都可以处理事件对象,但具体由哪个处理者处理,需要运行时动态决定。事件和处理者应该有个等级或权限的字段,匹配则直接处理,不匹配则传递给下一个处理者。当请求不知道要交个哪个处理者处理时,可以交由责任链自己决定。当需要多个处理者共同处理同一个事件时。2. 角色AbstractHandler 抽象处理者:定义了处理者传递或处理事件的规则,抽象处

2021-08-12 13:46:33 60

原创 设计模式--代理模式

代理模式代理就是请别人帮你办事,但是别人只能在你委托的事情上代表你,不会拥有其他权限。代理更多是通过接口限定功能。1. 使用场景客户端不想直接访问某对象(保护代理),或直接访问某对象时有困难(远程代理),就可以使用一个代理对象来实现间接访问。真实对象和代理对象必须实现相同的接口,才能让客户端实现透明的访问。2. 角色Subject 抽象主题类,用于声明真实对象和代理对象共同的接口方法。RealSubject 真实主题类,被代理的对象,客户端通过代理对象间接访问该对象中方法。ProxySubj

2021-08-12 13:45:32 40

原创 设计模式--享元模式

享元模式享元模式尝试重用现有的对象,再无法重用时才会创建对象,这样可以减少内存占用和提高性能。享元对象中可以共享的是内部状态,不能共享的是外部状态。举例:打印火车票:车票上车辆编号是固定的,始发站点和到达站点的组合也是有限且固定的,不同站点之间的时间也是相对固定的,车票价格也是相对固定的。 这些都属于内部状态。而乘客名称、乘客身份证号是不固定的。如果每张票都要新建对象进行打印,那1000张票就得1000个对象。如果使用享元模式,使用map来存储车票对象,起点终点作为键,起点终点相同的车票对象作为值

2021-08-10 19:33:43 65

原创 设计模式--外观模式

外观模式(Facade)向客户端提供一个统一的接口(一个类),隐藏系统的复杂性,对外提供系统功能的简化访问和对现有功能的委托调用。就是做封装,方便使用。1. 使用场景做的一个插件或者系统越来越复杂,功能越来越多,可以通过Facade模式隐藏系统的复杂性,对外提供一个简单的接口。当需要构建一个层次结构的子系统,可以使用Facade模式创建每层的入口点。2. 角色Facade 系统对外提供的统一接口,用户无需感知子系统之间的交互。子系统接口 系统所包含的子系统3. 实践// 1. 定义子系

2021-08-10 19:33:09 52

原创 设计模式--装饰器模式

装饰器模式动态的给类添加一些额外的职责,而不是给类添加。这里io类里面大量用到了该模式。1. 使用场景在需要不影响其他对象的情况下,动态透明的给单个对象添加扩展功能。可以在不生成很多子类的情况下扩展类功能。可以动态扩展和撤销功能。2. 角色Component 抽象组件 被装饰对象的原始抽象接口ConcreteComponent 组件具体实现类 即具体的被装饰类Decorator 抽象装饰者 持有被装饰对象的引用,可以进行装饰ConcreteDecorator 装饰着具体实现类 装饰者具体

2021-08-10 19:32:26 112

原创 设计模式--组合设计模式

组合设计模式将对象组合成树形结构,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。1. 使用场景当用户需要忽略组合对象和单个对象的不同,统一使用组合结构中的所有对象时,可使用该模式。当用户调用根节点的方法时,会调用树中所有节点的方法。2. 角色首先树状结构肯定含有根节点、分枝节点、叶子节点。Component 抽象根节点,规定了节点拥有的方法。Composite 定义枝干节点的行为,存储子节点。Leaf 定义叶子节点,定义节点行为。3. 实践安全的组合

2021-08-10 19:31:48 88

原创 设计模式--适配器模式

适配器模式将两个不兼容的类融合在一起,将一个类的接口转换为客户希望的另一个类可用的接口,使之可以协同工作。核心就是:适配器继承或依赖已有的对象,实现想要的接口。1 使用场景系统需要使用现有的类,但此类不符合现有的调用要求。需要创建一个可以重复使用的类,将彼此关系不大的类引入到一起工作。需要通过接口转换,将一个类插入另一个类中。如:类A的show方法中接收B类型的参数并调用B类型中dance方法,现在想传入C类型对象,可以创建一个实现了B接口的适配器,将C类型对象传入该适配器,再将该

2021-08-10 19:28:18 51

原创 设计模式--原型模式

原型模式在需要重复创建一个复杂对象时,可以使用“克隆”的手段来复制一个对象实例,通过这种方式创建对象称为原型模式。1 使用场景类初始需要消耗较多的数据、硬件资源时;或new对象需要比较繁琐的数据准备和访问权限时;或一个对象会被其他多个对象访问并修改其属性,可拷贝多个对象供其调用,保护性拷贝;使用原型模式创建对象不一定会比new快,所以使用该模式时需要考虑实际效率。浅拷贝2 角色Prototype 抽象类或者接口,具备clone能力。实际中就是 Cloneable 接口,实现该接口则标识该

2021-08-10 19:27:14 61

原创 设计模式--建造者模式

建造者模式1.定义Builder模式同样是创建型模式,主要用于创建复杂对象,这里的复杂对象通常由各个部分的子对象构成,由于需求的变化,这些子对象的实现通常会发生剧烈变化,而将这些子对象组合在一起的算法却相对稳定。2.角色抽象产品 : 定义了产品的共有属性和方法,包含各属性的set方法。具体产品 : 具体产品,实现其中的抽象方法。抽象建造者 : 定义了构建产品涉及的配置方法,以及返回对象的create方法。具体建造者 : 实现具体的产品属性配置逻辑,产品对象实例创建,返回对象的create方法

2021-08-10 19:26:32 46

原创 设计模式--抽象工厂模式

设计模式–抽象工厂模式1 定义为了给客户端提供一组相关或者相互依赖的对象提供一个接口,而不用指定它们具体的类。定义总是抽象的,记点自己的理解。普通的工厂方法模式,工厂生产的一类相似的产品,比如说生产鞋的工厂、生产裤子的工厂、生产上衣的工厂。通过调用具体工厂类的创建方法并传入参数就可得到我们想要的产品,如生产鞋的具体工厂,传入对应颜色就可以得到指定颜色的鞋子。特点是每个工厂只有一个创建产品的接口方法。抽象工厂模式,工厂生产一组相关的产品,同样拿服饰来举例,之前是单品工厂,现在需要套装,一个工厂中鞋子

2021-08-10 19:25:45 80

原创 设计模式--工厂方法

工厂方法模式主要用于生成复杂对象,如果只通过new就可以完事,就不用该模式。这个模式看起来简单,但感觉很难理解,不晓得存在的意义是什么,都知道子类名称了为什么不直接new(或许是实际创建比较复杂,例子都偷懒使用简单的类型,所以可以直接new就完成对象创建了)都拿到Class 自己通过反射也可以直接拿到对象实例,和在工厂中使用反射生成有什么区别?工厂一般来说都生成一类相似的产品,比如说罐头工厂,生产黄桃罐头、杨梅罐头、凤梨罐头。客户通过工厂对外的接口来获得自己想要的产品。对客户而言,需要知道这个产品能

2021-08-10 19:24:53 61

原创 设计模式--单例模式

单例模式保证该类只有一个实例,收回了实例的创建权限,通过一个对外接口提供实例对象。使用场景当创建一个对象需要消耗很多资源,或设计要求系统中该类只能有一个实例时使用该模式。实现要点构造函数私有化通过静态方法或枚举返回单例对象,单例类中使用私有静态引用持有本对象确保在获取对象时是线程安全的确保反序列化时不会重新构建该对象实践1.饿汉模式实现简单,但不能做到延迟加载public class SingletonPattern1 implements Serializable {

2021-08-10 19:23:58 63

原创 Dart基础之Isolate

Dart基础之Isolate背景在其他语言中为了高效利用多核CPU,通常使用多线程并行来实现并发执行代码,通过共享数据来保证多线程之间的协同,但这种模式衍生出了很多问题,开辟线程带来资源消耗,数据共享代理死锁问题。不论是APP还是Web端,CPU大多数时间是处于空闲状态的,一般不需要密集和高并发的处理。Dart作为面向前端开发设计的语言,在并发设计上没有采用多线程方案,而是使用了Isolate(隔离区)这种单线程模型来解决并发任务对于多线程的依赖。Isolate组成每个Isolate由以下几部分组

2021-05-12 19:16:21 640

原创 Android 开发错误记录

1.开发时提示error: XML or text declaration not at start of entity.在gradlew命令后面arguments中添加–stacktrace -info ,再次编译定位具体出错的文件,最后发现时布局文件中声明了两次version和encoding。<?xml version="1.0" encoding="utf-8"?><?xml version="1.0" encoding="utf-8"?>...

2021-04-29 13:55:42 129

原创 Flutter错误积累

1.显示Waiting for another flutter command当运行flutter时出现如下报错信息时可以尝试清除sdk缓存的问题来解决。D:\Android\FlutterSdk\bin\flutter.bat --no-color upgradeChecking Dart SDK version... Downloading Dart SDK from Flutter engine 66344068899635154addec16005167113b9c1e9d... Buil

2021-04-29 13:46:16 1176

原创 Flutter应用架构之BloC模式实践

1.引言写这篇文字目标是让大家轻松上手BloC模式的开发过程,从了解到应用。掌握BloC应用,理解BloC原理。从Bloc模式的设计原理出发,通过一小时的学习,轻松掌握Bloc模式的项目实践。在此之前你需要具备以下条件:(1)会Dart语言,尤其对异步和Stream要有了解。(2)学过Flutter,使用Flutter开发过单独的页面。(3)最好是实践过MVP模式,熟悉应用分层设计的过程。2.Flutter中的状态管理界面编程可以简化为操作触发事件,事件变更状态。flutter 使用了与很多

2021-04-09 15:26:48 2061 1

原创 软件工程笔记

第一周 概论软件是什么?计算机系统中的程序及其文档,2.软件有什么特点?软件是无形的,由设计开发而来,较为复杂,开发成本高,易于复制,开发只是部分成本。3.软件的分类?系统软件、支撑软件、应用软件。4.软件发展的三个阶段?个人编程-》小作坊生产-》软件工程 ,产生了质量差、投入高、开发复杂性和成本越来越高的问题。产生软件危机。5.软件工程定义将系统的、规范的、可量化的工程化方法引入到软件的开发、运行和维护过程中。就是用工程化的方法来开发和维护软件,解决软件危机。6.软件开发的本质

2021-03-03 15:48:32 497

原创 JetPack学习Note

1.ContraintLayout这里首先学到了魔法棒可以自动建立链接,控件的Attributes中可以点击右侧按钮直接编辑资源文件。ComponentTree中可以展示控件的结构和问题点,最好按规范逐一解决。Ctrl+左键可以删除约束...

2020-10-20 17:19:36 214 1

原创 Android中windowSoftInputMode的配置与软键盘状态

Android中windowSoftInputMode的配置与软键盘状态在manifest文件中可对Activity进行android:windowSoftInputMode=""的配置,该配置项决定了进入该界面后软键盘的弹出状态,一共有10种状态。state配置决定了是否显示软键盘。adjust配置决定了显示软键盘时如何调整界面布局。1. stateUnspecifiedandroid:windowSoftInputMode="stateUnspecified"未指定:这是Activity的默

2020-09-21 18:41:34 542

原创 Win10 Terminal配置

Win10 Terminal配置搞定一套好看的Terminal配置,记录下// To view the default settings, hold "alt" while clicking on the "Settings" button.// For documentation on these settings, see: https://aka.ms/terminal-documentation{ "$schema": "https://aka.ms/terminal-profi

2020-09-14 21:00:19 492

原创 Android开发Note--慕课网我的云音乐

1 引入阿里nexus镜像库 maven { url 'https://maven.aliyun.com/repository/public ' } maven { url 'https://maven.aliyun.com/repository/google ' } google() jcenter()

2020-09-14 20:56:50 347

原创 Retrofit从基本使用到源码学习

Retrofit从基本使用到源码学习A type-safe HTTP client for Android and Java正如官方所说,Retrofit是一个在Android和Java上使用的类型安全的Http客户端。底层网络请求依赖okHttp。一 基本使用1 引入依赖implementation 'com.squareup.retrofit2:retrofit:2.0.2'implementation 'com.squareup.retrofit2:converter-gson:2.0.2

2020-08-03 23:25:06 266

Android功能点.pdf

Android 涉及的主要功能点

2021-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除