vim笔记
有些时候当我们使用Vi/Vim编辑文件时如果没有注意到文件权限的时候,当最后进行保存时候的可能会提示以下错误,如果强制退出后再切换用户,肯定会丢失当前的改动,可以按下边的方法执行:
在Vi/Vim编辑器进入冒号,然后输入以下命令 %! sudo tee % /dev/null
此时会提示输入sudo用户的密码
effective-java读书笔记2
第一条:考虑用静态工厂方法代替构造器优势:
静态工厂方法有名字,当一个类需要多个带有相同签名的构造器时,就用静态工厂方法代替构造器,并且慎重的选择名称以便突出他们之间的区别。
不必在每次调用它们的时候都创建一个新对象。
它们可以返回原返回类型的任何子类型的对象。这样我们在选择返回对象的类时就有了更大的灵活性。
创建参数化类型实例的时候,它们使代码变得更加简洁(但在新版本的java中已经可以省略)
List<String> list = new ArrayList<String>();
劣势
类如果不含公有的或者受保护的构造器,就不能被子类化。
它们与其它的静态方法实际上没有任何区别。在API文档中,它们没有像构造器那样在API文档中明确的标识出来。因此要想查明如何实例化一个类非常困难。
第六条:避免创建不必要的对象String s = new String("bikini"); // DON'T DO THIS!
String s = "bikini"; //good
判断一个字符串是否是一个合法的罗马数字:
// Performance can be g ...
cmder配置使用
安装cmder官网
下载的时候,有两个版本,分别是mini与full版;唯一的差别在于有没有内建msysgit工具,这是Git for Windows的标准配备;全安装版 cmder 自带了 msysgit, 压缩包 23M, 除了 git 本身这个命令之外, 里面可以使用大量的 linux 命令;比如 grep, curl(没有 wget); 像vim, grep, tar, unzip, ssh, ls, bash, perl 对于爱折腾的Coder更是痛点需求。
配置cmder
把 cmder 加到环境变量:可以把Cmder.exe存放的目录添加到系统环境变量;加完之后,Win+r一下输入cmder,即可。
添加 cmder 到右键菜单:在某个文件夹中打开终端,在管理员权限的终端输入以下语句即可:
Cmder.exe /REGISTER ALL
常用快捷键
可以利用Tab,自动路径补全;
可以利用Ctrl+T建立新页签;
利用Ctrl+W关闭页签;
还可以透过Ctrl+Tab切换页签;
Alt+F4:关闭所有页签
Alt+Shift+1:开启cmd. ...
js高级程序设计-读书笔记2
引用类型
Object类型 创建Object实例的方式有两种:
var person = new Object();
person.name = "Nicholas";
person.age = 29;
//字面量方式:
var person = {
name : "Nicholas",
age :29
}
一般来说,可以使用点表示法来访问对象属性,但也可以使用[]来访问对象属性,应该将要访问的属性以字符串的形式放在[]中,[]方法的主要优点是可以通过变量来访问属性。2. Array类型
创建方式:
var colors = new Array();
var colors = new Array(20);
var colors = new Array("red","blue","green");
var colors = new Array(3);//创建一个包含三项的数组
var colors = new Array("Greg");//创建包含"Greg"一项的数组
v ...
js高级程序设计-读书笔记
<script>标签
无论如何包含代码,只要不存在defer和async属性,浏览器都会按照<script>元素在页面中出现的先后顺序对他们依次进行解析。
在文档的<head>元素中包含所有javascript标签,意味着必须等到全部的javascript代码都被下载、解析和执行完成后,才能开始呈现页面的内容(浏览器在遇到<body>标签时才开始呈现内容),所以,一般都这样写:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=<device-width>, initial-scale=1.0">
<meta http-equiv=&q ...
设计模式-职责链模式
定义避免请求发送者与接收者 耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
UML
Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。因为每一个处理者 的下家还是一个处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象(如结构图 中的successor),作为其对下家的引用。通过该引用,处理者可以连成一条链。
ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是 否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理 者中可以访问链中下一个对象,以便请求的转发。
总结
职责链模式的主要优点如下:
职责链模式使得一个对象无须知道是其他哪一个对象处理其请求,对象仅需知道该请求会被处理即可,接收者和发送者都没有对方的明确信息,且链中的对象不 ...
设计模式-装饰模式
定义动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
UML
Component(抽象构件):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作。
ConcreteComponent(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。
Decorator(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
ConcreteDecorator(具体装饰类):它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为。
总结
装饰模式的主要优点如下:
对于扩展一个对象的功能,装饰 ...
设计模式-建造者模式
定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。
UML
Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一 类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方 法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品 的内部表示并定义它的装配过程。
Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建 造者的类型 ...
设计模式-原型模式
定义使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
UML
Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以 是抽象类也可以是接口,甚至还可以是具体实现类。
ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直 接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体 原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
总结
原型模式的主要优点如下:
(1) 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率。 (2) 扩展性较好,由于在原型模式中提供了抽象原型类,在客户端可以针对抽象原型类进行编程,而将具体原型类写在配置文件中,增加或减少产品类 ...
effective java读书笔记
第52条:通过接口引用对象如果有合适的接口类型存在,那么对于参数、返回值、变量和成员变量来说,就都应该使用接口类型进行声明;如果你养成了用接口作为类型的习惯,你的程序将会更加灵活,当你决定更换实现时,所要做的就只是构造器中类的名称。有一点值得注意:如果原来的实现提供了某种特殊的功能,而这种功能并不是这个接口的通用约定所要求的,并且周围的代码又依赖于这种功能,那么新的实现也要提供相同的功能。类实现了接口,但是提供了接口中不存在的额外的方法–例如LinkedHashMap。如果程序依赖于这些额外的方法,这种类就应该只被用来引用它的实例。实际上,给定的对象是否具有适当的接口应该是很显然的。如果是,用接口引用对象就会使程序更加灵活;如果不是,则使用类层次结构中提供了必要功能的最基础的类。
第38条:检查参数的有效性每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,应该把这些限制写到文档中,并且在这个方法体的开头处,通过显式的检查来实施这些限制
第43条:返回0长度的数组或者集合,而不是Null返回类型为数组或集合的方法没理由返回null,应该返回一个零长度的数组或者集合。可以做成在 ...
设计模式-适配器模式
定义将一个接口转换成客户希望的另一个接口,使接口不兼容的哪些类可以一起工作,其别名为包装器(Wrapper)。
UML根据适配器类与适配者类的关系不同,适配器模式可分为对象 适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配 器模式中,适配器与适配者之间是继承(或实现)关系。在实际开发中,对象适配器的使用 频率更高,对象适配器结构如下:
Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个 Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可 能没有适配者类的源代码。
设计模式-工厂方法模式
定义与简单工厂模式不同,在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。
UML
Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
ProductA(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(FactoryMethod),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
FactoryA(具体工厂):它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
总结工厂方法模式的主要优点如下:
用户只需要关心所需产品对应的工厂,不需要关心创建细节。
系统中加入新产品时,无需修改抽象工厂和抽象产品类,只需要添加具体的产品类和工厂类,符合开闭原则。
工厂方法模式的主要缺点如下:
增加产品时,需要创建具体的产品类和具体的工厂类 ...