模版方法是一种只需要使用继承就可以实现的非常简单的模式。他由两部分组成,第一部分是抽象父类,第二部分是具体实现子类。通常在抽象父类中封装了子类的算法框架,包括实现一些共用方法以及封装子类所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。
Coffee or Tea
假设我们现在要泡一杯咖啡步骤如下:
* 把水煮沸
* 用沸水冲泡咖啡
* 把咖啡倒进杯子
* 加糖和牛奶
泡茶的步骤:
* 把水煮沸
* 用沸水浸泡茶叶
* 把茶水倒进杯子
* 加柠檬
经过比较,我们可以发现泡茶和泡咖啡有以下共同点:
原料不同。一个是茶一个是咖啡,但是我们都可以把它们抽
继续阅读 »
从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是"特性"、"特点",我们可以理解为,使用Trait关键字,可以为PHP中的类添加新的特性。
熟悉面向对象的都知道,软件开发中常用的代码复用有继承和多态两种方式。在PHP中,只能实现单继承。而Trait则避免了这点。下面通过简单的额例子来进行对比说明。
继续阅读 »
Introduction
在[PHP设计模式(四):继承][2]中我们介绍了继承,利用extends来进行程序设计的方法。
在[PHP设计模式(二):抽象类和接口][3]中我们介绍了接口,事实上也存在利用interface的程序设计方法,那就是多态。
和C/C++,Java,Python等语言一样,PHP也支持多态。多态更多是是一种面向对象程序设计的概念,让同一类对象执行同一个接口,但却实现不同的逻辑功能
。
多态/Polymorphism
还是用动物、鲸鱼和鲤鱼来举例:
interface IEat {
function eatFish();
function eatMoss();
}
class Wha
继续阅读 »
RAMDirectory和FSDirectory都继承自BaseDirectory,而BaseDirectory继承自Directory,Directory是Lucene中设计的一个顶层抽象类,可以将其看做本地文件系统的一个目录。
RAMDirectory是基于内存实现的,具有较高的存储速度,但是受到内存大小的限制,而FSDirectory是基于文件系统实现的,针对不同的操作系统有不同的具体实现类,这些实现类无需用户操心,只需要调用FSDirectory.open(Path path)方法,它就会帮助我们选择最适合的子类,FSDirectory的瓶颈在于磁盘I/O。
如果机器内存足够大的话,那么组合使用RAMDirectory和
继续阅读 »
做Android 5年多了,第一次在Fragment中使用WebView,先将Activity中的代码复制过来改改,没有想到,竟然无法正常显示,而是打开手机浏览器渲染WebView,返回后,Fragment一片空白。这还能忍受?Google一把,说是要继承WebViewFragment,但是一旦继承,就破坏了我的框架结构。然后看了下WebViewFragment的源码,并不复杂。所以就将相关的源码合并到现有的fragment中,本以为可以妥妥地解决问题,结果还是那样。最后在stackoverflow上解决了终极解决办法,那就是需要设置特殊的WebViewClient。
java
private class H5WebVie
继续阅读 »
此版本主要修复一些稳定性问题。
更多使用说明,请阅读:文档手册。
项目源码:Github, Gitee.
改进
改进add_files,支持对files粒度进行编译选项的各种配置,更加灵活。
从依赖的target和option中继承links和linkdirs。
改进target.add_deps接口,添加继承配置,允许手动禁止依赖继承,例如:add_deps("test", {inherit = false})
移除tbox.pkg二进制依赖,直接集成tbox源码进行编译
Bugs修复
修复目标级联依赖问题
修复target:add和option:add问题
修复在archlinux上的编译和安装问题
修复/ZI的兼容性
继续阅读 »
说明
类别名可以随便取。
类别是一个类,它是添加了新功能的现有类。
使用类别就是为了能够为现有类添加新的方法,不用继承该现有类,就可使用现有类的对象调用添加的方法了。
类别可以使类的实现分散在多个文件中。
类别中不能有变量,类别中没有放变量的位置。
如果类中的方法和类别中的方法名称相同,这将造成冲突,类别的方法将完全取代类的方法。
同一个类的不同类别声明了相同的方法,这将导致不稳定,哪个方法会被调用是不确定的。
不建议在类别中覆盖类中的方法,因为在类别中的方法不能调用superClass的方法(因为没有元数据支持)。
类别方法不能覆盖于同一个类的其它类别中的方法。因为无法预知他们的加载优先顺序,就可能在编译时出错。
对类库的类别方
继续阅读 »
上一篇介绍了150行代码实现滑动退出功能,相对来说比较简单,那么这篇文章稍微复杂点,有350行代码。
1. CircleImageView:继承系统的View,重写系统的方法;
2. 自定义style属性:供使用者在xml文件中配置,方便使用;
有多么好用就不罗嗦了(我左侧的头像就是),直接上代码:
more
```java
public class CircleImageView extends ImageView {
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
private static final Bitmap.Co
继续阅读 »
1.Java与C++的异同
Java解释性语言:源代码-编译器(字节码)-JVM执行
C/C++编译型语言:编译链接成二进制代码
Java不存在全局变量,全局函数,没有指针,不支持多重继承,不支持运算符重载,没有预处理器,不提供goto语句(但保留关键字),不支持自动强制类型转换,必须显式强制类型转换。
Java为纯面向对象语言,所有代码包括函数,变量等都属于类
继续阅读 »
Java访问修饰符
|访问修饰符|作用范围|
|---|---|
|public| 完全开发|
|private|只能本类访问|
|protected|同包及子类访问|
|default(无修饰符时)|同包访问|
Java用于类的修饰符(2个)和限定符(2个)
|访问修饰符|作用范围|
|---|---|
|public| 完全开发|
|default(无) |同包访问|
注意:内部类可以拥有更多的访问修饰符
more
|限定符|描述|
|---|---|
|abstract|指定为抽象类|
|final|指定为最终类,不可被继承|
Java用于成员变量的修饰符
public
protected
private
继续阅读 »