自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

黄俊彬

优秀是一种习惯,坚持是一种品质

  • 博客(47)
  • 收藏
  • 关注

原创 破解遗留系统快速重构的5步心法(附实例)

前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开发一套新系统,想重构也没有合适的人力物力以及时机,只能继续凑合用。说实在的,这确实不只是朋友他们一家公司会遇到的问题,而造成这种情况的原因大概率有以下几点:编码之前缺乏有效的设计成本上的考虑,在原功能堆砌式编程缺乏有效代码质量监督机制

2023-02-21 11:18:29 572

原创 设计模式-桥梁模式

1.桥梁模式的定义及使用场景定义:桥梁模式也称为桥接模式,是结构型设计模式之一。将抽象和实现解耦,使得两者可以独立地变化使用场景:不希望或不适合使用继承的场景 例如继承层次过渡、无法更细化设计颗粒等场景,而要考虑使用桥梁模式接口或抽象类不稳定的场景 明知道接口不稳定还想通过实现或继承来实现业务需求,那是得不偿失,也是比较失败的做法重用性要求较高的场景2. 桥梁模式的优缺点2.1优点抽象

2017-03-08 13:36:20 535

原创 设计模式-享元模式

1.享元模式的定义及使用场景享元模式是对象池的一种实现。享元模式用来尽可能减少内存的使用量,它适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对象共享、避免创建过多对象的效果,这样一来就可以提升性能、避免内存移除等。享元对象中的部分状态是可以共享,可以共享的状态分为内部状态,内部状态不会随着环境变化;不可共享的状态则称为外部状态,他们会随着环境的改变而改变。在享元模式中会建议一个对象容器

2017-03-07 09:36:17 510

原创 设计模式-解释器模式

1.解释器模式的定义及使用场景解释器模式是一种用得比较少的行为模式,其提供了一种解释语言的语法或表达式的方式,该模式定义了一个表达式接口,通过该接口解释一个特定的上下文定义:给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子使用场景:重复发生的问题可以使用解释器模式 例如,多个应用服务器,每天产生大量的日志,需要对日志文件进行分析处理,由于各个服务器的日

2017-03-06 10:22:33 507

原创 设计模式-状态模式

1.状态模式的定义及使用场景状态模式中的行为是由状态来决定的,不同的状态下又不同的行为。状态模式和策略模式的结构几乎完全一样,但他们的目的,本质却完全不一样。状态模式的行为是平行的、不可替换的,策略模式的行为是彼此独立、互相替换的。定义:当一个对象内在状态改变时允许其 改变行为,这个对象看起来像改变了其类。状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发送了改变

2017-03-04 15:20:40 440

原创 设计模式-访问者模式

1.访问者模式的定义及使用场景访问者模式是一种数据操作与数据结构分离的设计模式,访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的处理。在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施acce

2017-03-03 08:23:59 567

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

1.备忘录模式的定义及使用场景备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露。定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象回复到原先保存的状态使用场景:需要保存一个对象在

2017-03-01 10:02:19 700

原创 设计模式-外观模式

1.外观模式的定义及使用场景外观模式(Facade)在开发过程中的运用频率非常高,尤其是在现阶段各个第三方SDK充斥在我们的周边,而这些SDK很大概率会使用外观模式,通过一个外观类使得整个系统的接口只有一个统一的高层接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节。定义:要求一个子系统的外部与其内部的通讯必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用使用场

2017-02-28 09:29:18 390

原创 设计模式-观察者模式

1.观察者模式的定义及使用场景观察者模式是一个使用率非常高的模式,它最常用的地方是GUI系统,订阅-发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小。定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所以依赖于它的对象都会得到通知并被自动更新使用场景:关联行为场景,需要注意的是,关联行为时可拆分的,而不是“组合”关系;事件多级触发场景

2017-02-27 11:00:57 548

原创 设计模式-组合模式

1.组合模式的定义及使用场景组合模式也称为部分整体模式,结构型设计模式之一,组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别。生活中一个比较经典的例子就是组织结构的树状图。 定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

2017-02-24 09:32:51 1537

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

1.迭代器模式的定义及使用场景定义:迭代器模式又称游标模式,是行为型设计模式之一。其源于对容器的访问,比较java的List、Map、数组等。如果将容器遍历的方法封装在容器中,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,如果不提供遍历的方法而让使用者自己去实现,又会让容器的内部细节暴露。正因于此,迭代模式应运而生。 迭代器模式提供一种方法顺序访问一个容器对象的各个元素,而又不

2017-02-23 09:33:18 1514

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

1.适配器模式的定义及使用场景定义:适配器模式在我们的开发中使用率非常高,从代码中随处可见的Adapter就可以看出来,从最早的ListView、GridView,到现在最新的RecycleView都需要用到Adapter。说到底,适配器就是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得他们能够协作起来。 适配器模式把一个类在接口变换成客户端所期待的另一种接口,从而使原本

2017-02-22 10:10:48 1388

原创 设计模式-策略模式

1.策略模式的定义及使用场景定义:在软件的开发中常常遇到一个情况,实现某一个功能可以有多种算法或则策略,我们根据实际情况选择不同的算法或则策略来完成该功能。针对这种情况,一种常规的方法是将多种算法写在一个类中,通过if-else等条件判断语句来选择具体的算法,但明显违背了开闭原则和单一责任原则。如果将这些算法或则策略抽象出来,提供一个统一的接口,不同的算法或则策略有不同的实现,这样在程序客户端就可以

2017-02-21 10:11:14 1431 1

原创 设计模式-装饰模式

1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景:需要扩展一个类的功能,或给一个类增加附加功能需要动态地给一个对象增加功能,这些功能可以再动态地撤销需要为一批的兄弟类进行改装或加装功能,当

2017-02-20 13:59:51 1414

原创 Android事件分发底层原理

1.简介1.1事件构成在Android中,事件(TouchEvent)主要包括点按、长按、拖拽、滑动等,所有的事件都由如下三个部分组成按下(ACTION_DOWN)移动(ACTION_MOVE)抬起(ACTION_UP)一般来说,一次完整的Touch事件,应该是由一个Down、一个Up和若干个Move组成。

2017-02-17 16:03:37 2597 1

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

1.责任链模式的定义及使用场景定义: 责任链模式是行为型设计模式之一。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 使用场景: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止

2017-02-14 09:35:39 1695

原创 设计模式-命令模式

1.命令模式的定义及使用场景定义:命令模式是行为型设计模式之一。将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以支持可撤销的操作使用场景:需要抽象出待执行的动作,然后以参数的形式提供出来,类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关

2017-02-08 19:24:03 1753

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

1.中介者模式的定义及使用场景定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。使用场景:

2017-02-07 09:04:39 1879

原创 设计模式-原型模式

1.原型模式的定义及使用场景定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象使用场景:1)类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗2)通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象

2017-02-06 08:40:20 1801

原创 2017年的小目标

2016年辞去了在研究院轻松的工作,来到了东莞,加入了新的公司。这一年,总体来说进步还是蛮大,主要一个是思想觉悟的提升,怎么说呢?作为一个程序员,经历过外包公司,一年10几个项目的折磨,也从事过自由软件开发者,也在很多人梦寐以求的事业单位待过,但是却时常感觉到内心的空洞。有幸通过博客及知乎了解到了行业大神们的学习经历,发现很多人比你都优秀,却比你加倍的认真,成功是有理由。优秀是一种习惯,坚持是一种

2017-02-04 18:22:43 2037

原创 设计模式-代理模式

1.代理模式的定义及使用场景代理模式也是委托模式,是结构型设计模式。定义:为其他对象提供一种代理以控制对这个对象的访问使用场景:当无法或不想直接访问某个对象或者访问某个对象存在困难时或者在访问某个对象的前后需要执行一些约定的方法,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口2.代理模式的优缺点2.1优点1)职责清晰:真

2017-02-03 09:47:48 2146

原创 Android之Context底层原理

1.Context基本概念Context的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”。从Android系统的角度来理解:Context是一个场景,代表与操作系统的交互的一种过程。Context在加载资源、启动Activity、获取系统服务、创建View等操作都要参与  。从程序的角度上来理解:Context是个抽象类,而Activity、Service、Ap

2017-01-19 10:00:32 3716

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

1.建造者模式的定义及使用场景Builder模式是一步一步创建一个复制对象的创建型模式,他允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。改模式是为了将构造复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。1.1定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建同步的表示1.2使用场景相同的方法,不同的执行顺序,产

2017-01-18 10:14:02 2558

原创 Android消息机制底层原理

1.概述Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。MessageQueue是消息队列。他的内存存储了一组消息,以队列的形式对外提供插入和删除的工作。他的内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表。Looper为消息循环,由于MessageQueue只是一个消息的存储单元,它不能

2017-01-17 20:44:47 3914

原创 设计模式-模板模式

1.模板模式的定义及使用场景定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。使用场景:1)多个子类有公有的方法,并且逻辑基本相同2)重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现3)重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其

2017-01-14 09:42:09 2928

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

1.抽象工厂模式的定义及使用场景抽象工厂也是创建型设计模式之一。为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体类。一个对象族有相同约束时可以使用抽象工厂模式。2.抽象工厂模式的优缺点2.1优点1)良好封装性,低耦合2)产品族内具有约束性,且为非公开状态2.2缺点产品族的扩展非常困难,需要修改抽象工厂及其实现,违背了开闭原则。但工厂

2017-01-11 12:13:39 2692

原创 设计模式-工厂模式

1.工厂模式的定义及使用场景工厂模式是创建型设计模式之一。定义一个用户创建对象的接口,让子类决定实例化那个类。工厂模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用2.工厂模式的优缺点2.1优点1)良好的封装性,代码结构清晰2)具有良好的扩展性,在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成需求变化3)典型解耦框架,遵

2017-01-10 09:36:16 2716

原创 设计模式-单例模式

1.单利模式的定义及使用场景确保某一个类只有一个实例,而且自行示例化并向整个系统提供这个实例。确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。例如创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。2.单例模式的优缺点2.1优点1)减少内存,特别是一个对象需要频繁地创建、销毁,而且创建或

2017-01-06 09:33:20 582

原创 设计模式-面向对象的六大设计原则

在应用的开发过程中,最难的不是完成应用的开发工作,而是在后续的升级、维护中让应用系统能够拥抱变化。拥抱变化也就是意味着在满足需求且不破坏系统稳定性的前提下保持高可扩展性、高内聚、低耦合,在经历了各版本的变更之后依旧保持清晰、灵活、稳定的系统架构。虽然在实际的应该开发中,要饱受产品的折磨和摧残、需要在极其有限的研发时间里完成功能、上线。但是我们仍需尽量保持遵循面向对象的六大设计原则,这才能让我们不必

2017-01-03 09:39:48 676

原创 排序算法总结

1.排序算法分类基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。2.排序算法的综合分析各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下:事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据

2016-12-24 15:19:16 2419

原创 排序算法-快速排序

快速排序(Quick Sort)通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这部分记录继续进行排序,以达到整个序列有序的目的最好情况o(logn)最坏情况o(n²)排序稳定,但需要额外的辅助空间 static void quickSort(int[] array, int low, int high) {

2016-12-24 11:26:43 2267

原创 排序算法-归并排序

归并排序(Merging Sort)利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列然后反复进行两两归并,直到得到一个长度为n的有序序列为止。     时间复杂度     最好情况o(nlogn)     最坏情况o(nlogn)     排序稳定,但需要额外的

2016-12-16 17:36:05 2256

原创 排序算法-堆排序

堆排序(Heap Sort)堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。堆排序的基本思想是,将待排序的序列构成一个大顶堆。此时整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其余堆数组的末尾就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次小值,如此反复

2016-12-14 23:25:17 2195

原创 排序算法-希尔排序

希尔排序(Shell Sort)升级版的插入排序,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2     时间复杂度:     1)最好情况o(n)     2)最坏情况o(n^3/2)性能高于插入排序 但不稳定。算法稳定性:通俗地讲就是能保证排序前2

2016-12-12 17:43:59 2136

原创 排序算法-插入排序

插入排序(Insert Sort)直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表,类似打扑克牌排列表。时间复杂度:     1)最好情况o(n)     2)最坏情况o(n²/4) 插入排序比选择排序及冒泡排序性能好些 static void insertSort(int[] array) { if

2016-12-12 17:42:03 1985

原创 排序算法-选择排序

简单选择排序(Simple Selection Sort)就是通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 时间复杂度:     1) 最好情况:本身有序,需要比较n-1次 时间复杂度为o(n)     2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)性能上略优于冒泡排序 减少了交换

2016-12-12 17:36:58 1936

原创 排序算法-冒泡排序

冒泡排序(Bubble BubbleSort)是一种交换排序,他的基本思路是: 两两比较相邻记录的关键字,如果反序则交换。时间复杂度:     1)最好情况:本身有序,需要比较n-1次 时间复杂度为o(n)     2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)每一轮的排序对下一轮的排序有帮助,数字如同气泡慢慢往

2016-12-12 17:26:29 1937

原创 查找算法-稠密索引、分块索引、倒排索引

1.稠密索引稠密索引时指在线性索引中,将数据集中的每个记录都对应一个索引项 。对于索引项一定是按照关键码有序的排列 索引项有序意味着可以使用顺序查找算法,这是稠密索引的有点, 但是如果数据集非常大,意味着索引也得有同样的数据集长度规模。public class Index { public int key; public Object value; public

2016-12-10 10:28:43 3441

原创 查找算法-顺序查找、有序查找

1.顺序表的查找1)顺序查找顺序查找又称为线性查找,是一种最简单的查找方法。        从表的一端开始,向另一端逐个按要查找的值key 与关键码key进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与关键码相同的key值,则查找失败,给出失败信息。说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是

2016-12-06 16:15:44 9463

原创 Android的Window底层原理

1.概述 Window是一个抽象类,他的实现是PhoneWindow。Window通过WindowManager创建,是访问Window的入口。Window的具体实现位于WindowManagerService中,WIndowManager与WindowManagerService的交互是一个IPC的过程。WindowManager中的Layoutparam中的Type表示Window的类

2016-12-05 12:00:12 3230

空空如也

空空如也

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

TA关注的人

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