自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 创建型模式(五):静态工厂模式

模式定义与简单工厂类似,该模式用于创建一组相关或依赖的对象,不同之处在于静态工厂模式使用一个静态方法来创建所有类型的对象,该静态方法通常是 factory 或 build。代码示例创建静态工厂,以后调用都用到这个静态工厂class StaticFactory{ public static function factory($type) { //通过传过来的类名,实现实例化 $className = __NAMESPACE__ . '\\' . uc

2021-01-29 22:11:51 91 1

原创 历时2个月喜提2字节安卓岗offer面试经验分享

前言从2020年11月开始面试准备到2020年最后一天31号晚上7点收到短信offer,历时两个月,在熬夜猝死边缘疯狂试探的我,终于等来我梦寐以求的“跨年礼物”。“日尼玛,退钱”,《温暖的抱抱》电影前10分钟的开场剧情,让我不禁想着该如何说服朋友一起离场,却被自己短信铃声拉回了思绪,“应该调成静音的”。无聊的剧情本就让整个电影院变得十分寂静,赶紧把手机调成静音,翻阅短信一看抬头是“字节跳动”的短信offer。至此,电影剧情也开始笑点频出,“嗯,是一部不错的爆米花喜剧电影”电影结束后和朋友议论道。对于这

2021-01-29 15:17:15 188

原创 创建型模式(四):工厂方法模式

工厂方法模式介绍工厂方法的使用频率很高,经常可以在一些项目中看见工厂方法(Factory Method) - 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类工厂方法针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例,相比于简单工厂来说,不再提供一个统一的工厂创建所有的对象优点工厂方法模式很好的减轻了工厂类的负担,把一种类交由一个工厂创建同时增加产品类并不需要修改工厂类,只需要添加创建该产品的工厂即可,使得工厂类符合开放-封闭原

2021-01-28 22:04:12 149

原创 创建型模式(三):抽象工厂模式

抽象工厂模式是什么是工厂方法设计模式的一种扩展。当有多个抽象角色时,使用的一种工厂模式。抽象工厂AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。ConcretePro

2021-01-28 15:16:37 133

原创 创建型模式(二):单例模式

介绍:单例模式是一种创建型模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点。类图:单例模式UML类图.pngSingleton(单例类):定义一个getInstance操作,允许客户访问它的唯一实例,getInstance是一个静态方法,主要负责创建自己的唯一实例。用法:• 确保某个类有且只有一个对象时。个人理解:• 创建一个对象需要消耗过多资源时(IO操作、访问数据库等)• 工具类、帮助类( 应用程序的日志应用、接入第三方SDK等)• 频繁实例化然后销毁的对象(日志、

2021-01-27 22:16:35 111

原创 创建型模式(一):建造者模式

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.适用场景建造者模式主要用于创建一些复杂的对象,这些对象内部的构建的建造顺序通常是稳定的,但对象内部的构造通常面临着复杂的变化。建造者模式是在当创建复杂对象的算法应该独立于改对象的组成部分以及它们的装配方式时适用的模式。优点如果我们用了建造者模式,那么用户就只需要指定需要创建的类型就可以得到它们,而具体建造的过程和细节就不需要知道了。建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏

2021-01-27 17:46:00 84 1

原创 结构型模式(六):组合模式

源代码:https://gitee.com/AgentXiao/CompositePattern要点:1、组合模式和组合的区别2、组合模式的实现3、组合模式的应用场景一、组合模式和组合组合是一种类的关系,在A类中定义一个B类,A拥有了B,叫组合。组合模式是一种设计模式。二、组合模式把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。组合模式的核心(1)抽象构件(Component)角色: 定义了叶子和容器构件的共同点.(2)叶子(Leaf)构件角

2021-01-26 22:22:46 150

原创 Android:克服这些困难,让你直达阿里P7!

写在前面;Android开发前几年火爆一时,市场饱和后Android程序员每一名程序员都想进阶,甚至成为架构师,但这期间,需要付出的辛苦和努力远超过我们的想象。就我这几年对所接触的Android工程师调研:97% 的Android开发 技术人都会面临这些困境(可能也是你的困惑)主要困境;**外包公司/小型团队技术闭塞:**如果你长期在小型软件公司或外包公司工作,是很难有机会经历完整且大型项目的开发,整个技术视野会比较窄,导致薪资长期处于停滞不前;**重复同样的编码工作:**长期重复同样的编码工作

2021-01-26 18:03:31 114

原创 结构型模式(五):外观(门面)模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述门面(Facade)模式的:门面模式(外观模式)是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。医院的例子现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一

2021-01-25 22:15:25 59

原创 结构型模式(四):代理模式

在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。在软件设计中,使用代理模式的例子也很多,例如,要访问的远程对象比较大(如视频或大图像等),其下载要花很多时间。还有因为安全原因需要屏蔽客户端直接访问真实对象,如某单位的内部数据库等。代理模式的定义与特点代理模式的定义:由于某些原因需要给某对象提供一个代理以控

2021-01-25 17:29:37 125

原创 结构型模式(三):装饰器模式

允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。装饰器模式.jpg简单装饰器在原类型基础上扩展class ClsA: def __init__(self): super().__init__()

2021-01-22 16:48:13 62

原创 结构型模式(二):适配器模式

适配器模式适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。介绍

2021-01-22 11:43:13 100 1

原创 结构型模式(一):桥接模式

定义桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。相关角色Abstraction:抽象类RefinedAbstraction:扩充抽象类Implementor:实现类接口ConcreteImplementor:具体实现类解决问题将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。UML

2021-01-21 17:28:28 81

原创 年轻人!快来看看在份呕心沥血整理出来的月薪20k+Android面试题吧!(含答案)

1.自定义Handler时如何避免内存泄漏答案:一般非静态内部类持有外部类的引用的情况下,造成外部类在使用完成后不能被系统回收内存,从而造成内存泄漏。为了避免这个问题,我们可以自定义的Handler声明为静态内部类形式,然后通过弱引用的方式,让Handler持有外部类的引用,从而可避免内存泄漏问题。以下是代码实现<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; w

2021-01-21 11:51:00 146

原创 2021-01-20

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为**最少知识原则(LeastKnowledge Principle, LKP),**其定义如下:迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之

2021-01-20 17:43:21 85

原创 六大原则(五):接口隔离原则

定义客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。问题由来类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。解决方案将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。举例来说明接口隔离原则:图1(图1 未遵循接口隔离原则的设计)这个图的意思是:类A依赖接口I中的方法1、方法2、方法3,类B是对类A依赖的实现。类C依赖接.

2021-01-20 11:54:16 125

原创 六大原则(四):依赖倒置原则

定义:①高级模块不应该依赖于低级模块,两者都应该依赖于抽象。②抽象不应该依赖于细节。③细节应该依赖于抽象。那么高级模块、低级模块,抽象,细节各指的是什么呢?每一个逻辑的实现都是由原子逻辑组成,不可分割的原子逻辑就是低级模块。而低级模块组装就是高级模块。在Java中,抽象就是指接口或抽象类,两者并不能直接被实例化。细节就是实现类,继承抽象类或实现接口的类就是细节。特点是可以被直接实例化。那么依赖倒置原则定义在Java语言中可以表示为:①模块间的依赖关系、实现类间的依赖关系都是通过接口或抽象类

2021-01-19 17:31:56 195

原创 六大原则(三):里氏替换原则

定义里氏替换原则(Liskov Substitution Principle,LSP)有两个定义。第一个定义是:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype

2021-01-19 11:46:31 211

原创 六大原则(二):开闭原则

开闭原则定义:软件中的对象(类,模块,函数等)应该对于扩展是开放的,对于修改是关闭的。英文全称(Open Close Principle),简称:OCP在实际开发中常常会遇到这样的问题,从别人那里接手过来的代码,还没来的及熟悉代码,项目就催着赶紧升级,当你想使用一个功能的时候,你可能发现项目里有相关代码,但是你又不敢用,你怕改出来问题,所以一般可能都会采取新增一块功能一样的代码。其实这就是简单的遵循了开闭原则。上面的场景相信大家都遇见过,你不想你写的代码,被别人诟病吧。所以掌握开闭原则要领很有必要性.

2021-01-18 17:22:51 163

原创 六大原则(一):单一职责原则

单一职责原则**定义:**不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。**问题由来:**类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。**解决方案:**遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险。说到单一职责原则,很多人都会不屑一顾

2021-01-18 11:44:04 109

原创 嵌入式Sqlite数据库(三):实战注解ORM数据库框架

前言Android的ORM框架有很多,比如Realm,greenDAO,LitePal,DBFlow,afinal,SugarORM,ORMLite和LiteORM,还有Anko的ManagedSqliteOpenHelper。其中Realm和GreenDAO在2017年百大框架排行榜里面排名最高,27名和28名。下面就来简单的说说这些框架并且说说Realm的使用和封装。ORM框架如果使用Android SQLite创建一个数据库需要实现下面的步骤:创建一个DBHelper类实现SqliteOpe

2021-01-15 22:07:18 680

原创 Android:大厂技术面试过不了怎么办?别急!这些知识体系让你的面试稳如泰山!

前言年年寒冬,年年也挡不住一个安卓程序员追求大厂的决心。想要进入大厂,我们需要掌握哪些知识点呢?这里,我为大家梳理了一个整体的知识架构。整体包括Java、Android、算法、计算机基础等等,相应的知识点的面试题都整理出来了。希望大家阅读之后,能帮助大家完善与整理自己的知识体系。祝大家早日进入自己理想的公司~~Java部分1.StringBuilderStringBuffer 线程安全,StringBuilder 线程不安全+实际上是用 StringBuilder 来实现的,所以非循环体可以直.

2021-01-15 17:28:49 161

原创 嵌入式Sqlite数据库(二):Sqlite升级与数据迁移方案

1. 前言一般在应用启动之后,都会有一个初始化的过程。此外,后续应用升级,需要考虑数据库数据及时更新、数据库表字段发生变化、表数据发生变化、兼容旧版本数据库等情况,所以在应用初期就需要考虑好数据迁移工作。2. 方案通过接口配合本地数据库表来保证数据完整性与兼容性。在iOS端的数据库中有一个TableVersion表,用来配置需要进行数据同步的数据表信息。每次在发出数据同步请求的时候,都会以TableVersion表里面的数据作为依据,来决定哪些表需要进行表结构变更,哪些表需要进行数据更新。2.1 T

2021-01-14 21:43:48 394

原创 嵌入式Sqlite数据库(一):SqliteOpenHelper

A helper class to manage database creation and version management.数据库的创建和版本管理的助手。SQLiteOpenHelper 是一个抽象类,abstract class.拥有成员变量,mName(数据库名称),mNewVersion(数据库版本),mDatabase(数据库)等.构造函数需要传递,context,数据库名称,数据库版本等信息.SQLiteOpenHelper(Context context, String nam

2021-01-14 17:47:04 442 1

原创 微信MMKV原理与实现(三):增量更新与全量更新

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。1.首次打开App第一次打开App,自然是先解压Hybrid Zip啦。通过‘CFBundleShortVersionString.CFBundleVersion’生成的版本标识符来判断是否需要重新解压Zip包,主要针对的是app通过更新上来需要解压新安装包中的Zip包。// 解压Hybrid Zip包- .

2021-01-13 21:28:52 564

原创 微信MMKV原理与实现(二):文件数据结构

说到轻量级的数据持久化,大家最先想到的就是SharedPreferences(以下简称SP)了,SP存储方式为xml,直接使用I/O流进行文件的读写,这就形成了一个弊端:每次写入或修改都需要替换掉原来的数据,并将所有数据 重新写入文件。可想而知,如果一个sp文件的内容过多,那么再写入的时候会造成卡顿,甚至会有 ANR的风险。一、I/O1、先看一下SP的工作原理虚拟内存被操作系统划分成两块:用户空间和内核空间,用户空间是用户程序代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是隔离的,即使

2021-01-13 17:16:01 696

原创 微信MMKV原理与实现(一):MMAP内存映射

一、什么是mmapmmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系,函数原型如下void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用

2021-01-12 21:45:25 670

原创 万事俱备面饿了么Android!面完哭了呜呜呜,还是美团香!

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了…当天怒清购物车,卸载饿死了么。下面是他回忆整理的凉经:一面(全都会)1.点击图标,应用打开,点击home键,重新进入,Activity生命周期回调 2.service生命周期 3.fragment什么时候用 4.软引用和弱引用,什么时候用弱引用? 5.LruCache内部通过什么数据结构..

2021-01-12 16:28:31 119

原创 Shared Preference原理

SharedPreferences作为Android存储数据方式之一,主要特点是:只支持Java基本数据类型,不支持自定义数据类型;应用内数据共享;使用简单.使用方法1、存数据SharedPreferences sp = getSharedPreferences("sp_demo", Context.MODE_PRIVATE);sp.edit().putString("name", "小张").putInt("age", 11).commit();12或者下面的写法也可以Share

2021-01-11 22:00:27 219

原创 Android文件系统:sdcard与内部储存

看看Google怎么说:Note: don’t be confused by the word “external” here. This directory can better be thought as media/shared storage. It is a filesystem that can hold a relatively large amount of data and that is shared across all applications (does not enforce

2021-01-11 17:31:04 651

原创 组件间通信方案(六):自动感知生命周期事件总线LiveDataBus

一、LiveDataLiveData是17年GoogleIO大会上提出来的一个新技术。相对于通信总线类型的框架EventBus和RxBus来说,它更简单,更简洁、更解耦。它具有以下优点:UI和实时数据保持一致因为LiveData采用的是观察者模式,这样一来就可以再数据发生改变时获得通知,更新UI避免内存泄漏观察者被绑定到组件的生命周期上,当被绑定的组件销毁(Destory)时,观察者会立刻自动清理自身的数据。不会再产生由于Activity处于stop状态而引起的崩溃当Activity处于后台

2021-01-09 16:49:24 578

原创 组件间通信方案(五):事件总线EventBus源码解析

getDefault 方法我们先从 EventBus 的入口,getDefalut 方法入手:public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance == null) { defaultInstance = new EventBus

2021-01-09 11:02:39 169

原创 组件间通信方案(四):ViewModel通信方案

ViewModel 简述ViewModel 旨在以生命周期感知的形式存储和管理 UI 控制器(Activity/Fragment 等)相关的数据,可以解决 UI 控制器中数据无法正确保留以及数据在其复杂的生命周期中难以维护的痛点,它的生命周期感知能力需要配合 Lifecycles 组件才能实现,本文聚焦于 ViewModel 所以先不讲 Lifecycles ,关于 Lifecycles 我会在其它文章详细介绍为什么使用 ViewModel ?我觉得这个问题很重要,当我们使用任何一个新工具的时候都需.

2021-01-08 16:19:24 1474

原创 组件间通信方案(三):Intent数据传输与限制

引入在使用Intent传输数据的时候,数据大小超过1M就会报错。崩溃异常:Exception: TransactionTooLargeException接下来来分析下为什么页面数据传输会有这个量的限制以及这个限制的大小具体是多少。道Context和Activity都含有startActivity,但两者最终都调用了Activity中的startActivity;而startActivity最终会调用自身的startActivityForResult;然后系统会调用Instrumentation

2021-01-07 16:44:34 269

原创 组件间通信方案(二):Android与Serivice通信

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题通过Binder对象当Activity通过调用bin

2021-01-07 11:39:21 85

原创 组件间通信方案(一):Activity和Fragment低藕通信设计

用户场景设想这样一种用户场景:在个人信息展示界面, 用户点击编辑按钮, 跳转到编辑界面, 完成编辑后, 回退到个人信息展示界面, 此时界面上应该展示最新的数据.这里涉及到编辑后的数据如何及时更新到个人信息界面, 也即Activity&Fragment之间如何通信的问题.分析由于Fragment需要依托于Activity存在, 故有如下几种通信场景:乍看上去可能不太好理解, 来依次分析下这几种场景.1.Activity与Activity通信此场景最为常见, 用户从Activity A

2021-01-06 16:04:24 176

原创 Service内核原理(三):前台服务与Notify

为降低功耗,无论应用的目标 SDK 版本为何,Android 8.0 都会对后台应用检索用户当前位置的频率进行限制。系统会对前台应用和后台应用进行区分。应用满足以下任一条件即视为前台应用:它具有可见的 Activity,无论Activity处于启动还是暂停状态。它具有前台服务。另一个前台应用通过绑定到应用的其中一个服务或使用应用的其中一个内容提供程序与应用相连。如果以上所有条件均不满足,应用即视为后台应用。如果应用在运行Android 8.0的设备上处于前台,其位置更新行为将与Android

2021-01-06 11:26:11 360

原创 Service内核原理(二):自带工程线的IntentService

为什么要使用IntentService:IntentService is a base class for {@link Service}s that handle asynchronous* requests (expressed as {@link Intent}s) on demand. Clients send requests* through {@link android.content.Context#startService(Intent)} calls; the* service is

2021-01-05 16:11:36 119

原创 Android:阿里P7大牛教你区分Handler.post和View.post的区别

缘起在Android开发中,我们经常会见到下面的代码,比如:protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("onCreate==="); setContentView(R.layout.activity_main); rootBtn = findViewById(R.id

2021-01-05 10:55:34 242

原创 Service内核原理(一):start与bind的区别

Android执行Service有两种方法,一种是startService,一种是bindService。下面让我们一起来聊一聊这两种执行Service方法的区别。1、生命周期上的区别执行startService时,Service会经历onCreate->onStartCommand。当执行stopService时,直接调用onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。执行bindService时,

2021-01-04 16:33:56 617

空空如也

空空如也

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

TA关注的人

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