- 博客(19)
- 收藏
- 关注
原创 设计模式拾贝——线程安全的单例设计模式:Doublecheck
在学习设计模式的时候,发现有这样一个十分巧妙的设计方式,虽然看起来并不复杂,但是有很多细节值得注意:先来看一下代码,稍后我们来解释这个设计的巧妙性:class Myclass { private static volatile Myclass instance; private Myclass() {}; public static synchronized Myclass getInstance() { if(instance == null) { synchronized(M
2020-07-11 20:08:16
314
原创 设计模式——(七)设计模式原则___迪米特法则
一、介绍1)一个对象应该对其他对象保持最少的了解2)类与类之间关系越密切,耦合度越大3)迪米特法则又叫做最小知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部,对外除了提供的public方法,不对外泄露任何信息4)迪米特法则还有个更简单的定义:只与直接的朋友通信。直接的朋友:,每个对象都会和其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量
2020-06-28 18:33:54
182
原创 设计模式——(六)设计模式原则___开闭原则
一、介绍1)开闭原则(OCP)是编程中最基础也是最重要的设计原则2)一个软件实体如类,模块和函数应该对扩展开放(提供方),对修改关闭(使用方),用抽象构建框架,用实现扩展细节。3)当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。4)编程中使用其他原则,以及设计模式的目的就是遵循开闭原则。二、应用假设我们需要实现这样的一个应用:需要客户端选择的几何图形种类来画出相应的图形。现在程序提供了画出矩形和圆形的两种功能,假设我们还需要添加一个画出三角形的功能,
2020-06-23 21:38:15
207
原创 设计模式——(五)设计模式原则___里氏替换原则
一、介绍里氏替换原则是指:如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1代换为o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所有引用基类的地方必须能透明地引用其子类的对象。在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法。里氏替换原则告诉我们,继承实际上让两个类的耦合性增强了,在适当的情况下,可以通过聚合、组合、依赖来解决问题。...
2020-06-23 18:36:42
174
原创 设计模式——(四)设计模式原则___依赖倒转原则
一、介绍依赖倒转原则是指:1)高层模块不应该依赖低层模块,二者都应该依赖其抽象。2)抽象不应该依赖细节,细节应该依赖抽象。3)依赖倒转原则的中心思想是面向接口编程。4)依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比细节为基础的架构要稳定的多。也就是说,我们在进行编程的时候,我们要专注于抽象类和接口,以抽象类和接口为基础搭建软件的框架,而不是从具体的实现类处着手。5)使用接口或抽象类的目的是制定“规范”,而不涉及任何具体的操作,并把展现细节的
2020-06-19 20:07:55
221
原创 设计模式——(三)设计模式原则___接口隔离原则
接口隔离原则一、定义1.客户端不应该依赖它不需要的接口。2.类间的依赖关系应该建立在最小的接口上。二、举例假设我们需要满足这样的一个设计需求:有一个接口interface1,具有五种操作方法operation1(),operation2(),operation3(),operation4(),operation5()。有A,B,C,D四个类,C、D实现interface1,、A通过interface1依赖C实现,但是只会使用其中的operation1、2、3三个方法。B通过interfa
2020-06-19 12:00:19
157
原创 设计模式——(二)设计模式原则___单一职责原则
设计模式原则综述设计模式原则,顾名思义,就是在程序设计中应当遵守的原则,也是各种设计模式的基础。设计模式常用的七大原则有:1)单一职责原则2)接口隔离原则3)依赖倒置原则4)里氏替换原则5)开闭原则6)迪米特法则7)合成复用原则本系列将分别对这些原则进行介绍。单一职责原则一、定义单一职责原则(Single Responsibility Principle, SRP)有且仅有一个原因引起类的变更二、背景在程序设计中,我们可能遇到这样的情况:类T负责两个不同的职责:职责P1、P
2020-06-18 18:12:52
102
原创 设计模式——(一)综述
前言软件构造复习中一个非常重要的部分就是设计模式。本系列将结合《设计模式》这本书对常用的若干种设计模式进行介绍。综述为什么要使用设计模式?——编写软件过程中,程序员面临来自耦合性,内聚性以及可维护性,可扩展性,灵活性,重用性等多方面的挑战。设计模式是为了让程序(软件)有更好的1)代码重用性即 相同功能的代码不用多次编写2)可读性编程规范性,便于其他程序员的阅读和理解3)可扩展性即:当需要增加新的功能时,非常方便,称为可维护。4)可靠性当我们增加一个新的功能时,对原有的功能没有影响。
2020-06-18 16:44:21
151
原创 白盒框架和黑盒框架的区别
前言在复习过程中遇到了关于白盒框架和黑盒框架的问题。课堂上给出了例子,但是理解的不是很好,现总结以区分。一、综述总的说来,白盒框架与黑盒框架有这样的特点:白盒框架1.通过继承和重写方法进行扩展2.设计模式:模板模式(Template Method)3.总的说来,白盒框架把框架中的主要方法放在父类中,子类对其进行实现黑盒框架1.通过委派的方法进行扩展2.设计模式:策略模式(Strategy)和观察者模式(Observer)3.总的说来,黑盒框架通过实现API的方式来完成二、例子白盒
2020-06-17 15:48:16
1214
原创 关于throws和throw
在复习过程中遇到了弄混throw和throws的问题。现留一足迹以明确:看下面一个例子:1、throw用在方法体内,throws用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。2、throw是具体向外抛异常的,抛出的是一个异常实例throws声明了是哪种类型的异常,使它的调用者可以捕获这个异常。在这个例子中,如果i=0,则throw所在的语句抛出一个ArithmeticException,然后随即这个异常就被抛出到更上一级去处理。注意这种使用方法必须保证throw语句处于一个tr
2020-06-15 20:07:19
342
原创 线程
一、什么是线程在课堂上对线程的进行了介绍,但是并没有深入系统地理解,因此在这里对有关线程的知识再次进行梳理。首先我们明确:线程是一个程序的内部控制流。如何理解?----线程是程序里面一种可区分的执行路径。举个例子这个程序只有一条固定的执行路径,即main->m1->m2->m3->main这表示程序只有一个“线程”。这里必须要提到一点:一个CPU在同一时刻只能支持一个线程。但是在执行的时候,实际上是一个CPU在不同的线程上反复切换,导致看起来好像是多个线程同时
2020-06-14 21:39:07
179
原创 对输入流和输出流的一个例子辨析
这里和我们一般编程中的输入输出流的使用不太一样,所以可能会导致误解。这里首先初始化了一个输出流:注意到这里的使用:dos是baos的装饰器,内部实现是委派baos往dos里面写一个随机数和一个true,由于dos是baos的装饰器,实际上数据写进了baos(注意到这个“写入流中”的操作)起一个读入器bais,用途是读baos的内容(已经用一个Byte数组存起来了,bais是读这个byte数组的输入流)起一个dis包装bais,读dis实质上就是读bais从dis里面读出浮点数和布尔量。(关.
2020-06-06 21:48:51
399
原创 JAVA输入流、输出流
经过这么多次实验,我们在想要读取一个文件中的内容时,往往会采用一种叫做“流”的东西来进行操作。总的来说:输入流就是把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中,输出流就是把内存(程序)中的数据输出到外设或其他地方。从文件角度简单总结就是,输入流就是读数据,输出流就是写数据。在这个过程中,始终把内存作为参考点。也就是说:输入流相当于一根管道,往内存中灌数据,输出流相当于一根管道,从内存往外灌数据。来看以下一个样例程序这里我们需要想象到这样的情形:in将Hellowor
2020-06-06 15:25:17
297
原创 软件构造中的委托(delegation)
上课的时候提到的“委托”这一概念,刚开始还不甚理解,知道真正动手做完lab3之后才开始有了深入的理解。总的来说委托指的是在一个类中以各种方式利用另一个类,完成类的功能。
2020-05-18 15:01:14
550
原创 关于LSP原则的一点思考
我们在讲LSP原则的时候,讲到父类和子类的关系,按照现实中的逻辑来判断,有一个值得关注的地方:即不能说“‘子类’是一个‘父类’”,一般的逻辑中,我们说“飞机 是 交通工具”“手枪 是 武器”这些继承都满足我们的日常直觉。但是我们提到了 “正方形 是 长方形” 则不满足这样的直觉其根本原因在于,正方形比长方形在原有的属性中有更强的限制,所有的长方形并没有“强制要求”它的属性所满足的要求。再举个例子:交通工具并没有对诸如外形 轮子数量 重量 价格 载人数等属性有强硬性的要求。这样就能从直观上来
2020-05-10 19:41:16
918
原创 关于List中的remove()与Iterator
很久没有开张了,一直在与ddl战斗,先留个坑,到时候补齐。在软构课程中老师提到一个例子:用iterator遍历list的时候,如果想要删除,那么必须用iterator的remove方法来进行删除,而不可以直接在list中删除。关于这一点老师并没有赘述。...
2020-04-16 20:45:53
731
原创 JAVA学习与LeetCode刷题——(三)链表的合并与分治算法
一:题目与分析23. 合并K个排序链表题目描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。(此题解、代码也已由本作者在LeetCode上发布)分析过程:正好在学分治+java,拿这道题练练手用分治法,思路比较简单,给这个链表序列两两分为一组,如果为奇数,就单独把最后一个作为一组,然后合并,每次待合并的链表都在这个lists的最前端。每次需要处理的链表数用...
2020-03-20 22:54:40
170
原创 JAVA学习与LeetCode刷题——(二)无重复字符的最长子串与HashSet
一:题目与分析3. 无重复字符的最长子串题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出:...
2020-03-05 23:25:25
173
原创 JAVA学习与LeetCode刷题——(一)最长公共前缀与String类
一:题目与分析14. 最长公共前缀题目描述:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。**示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。我的解答...
2020-03-04 13:38:43
315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人