Johnny Shieh

人如果没有梦想,跟咸鱼有什么分别


  • 首页

  • 分类

  • 归档

  • 标签

  • 读书

  • 小伙伴

  • 关于

  • 搜索

Kotlin 语言下设计模式的不同实现

发表于 2017-09-29 | 分类于 设计模式 | | 阅读次数

偶然在 Github 上看到 dbacinski 写的 Kotlin 语言下设计模式的不同实现(这里的不同是相对于 Java 语言的),有些实现非常好,但是有些实现的例子不是很赞同。所以自己写了 Kotlin 语言版本的 23 种设计模式的实现,充分利用 Kotlin 的语法糖,例如单例模式、策略模式等可以很巧妙地实现,其他实现方式与 Java 不变的也有代码示例,就当是回顾设计模式。

创建型模式

工厂方法模式

工厂方法把创建对象的过程抽象为接口,由工厂的子类决定对象的创建,Kotlin 下的实现与 Java 一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface Product {
val name: String
}
class ProductA(override val name: String = "ProductA") : Product
class ProductB(override val name: String = "ProductB") : Product
interface Factory {
fun makeProduct(): Product
}
class FactoryA : Factory {
override fun makeProduct() = ProductA()
}
class FactoryB : Factory {
override fun makeProduct() = ProductB()
}
阅读全文 »

AspectJ in Android (三),AspectJ 两种用法以及常见问题

发表于 2017-09-20 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

前面两篇文章介绍了 AspectJ 的基础概念以及基于注解开发方式的语法,这篇文章总结了 AspectJ 的两种用法和 android-aspectjx 插件的常见问题。

AspectJ 的两种用法

我觉得以 Pointcut 切入点作为区分,AspectJ 有两种用法:(1)用自定义注解修饰切入点,精确控制切入点,属于侵入式;(2)不需要在切入点代码中做任何修改,属于非侵入式。

侵入式

侵入式用法,一般会使用自定义注解,以此作为选择切入点的规则。

下面以 JakeWharton 大神的 hugo 为例,分析自定义注解 AOP 的使用。hugo 是用于在开发环境中打印方法调用信息的,只会打印注解修饰的方法。

首先看下新增的自定义注解:

1
2
3
@Target({TYPE, METHOD, CONSTRUCTOR}) @Retention(CLASS)
public @interface DebugLog {
}

上面定义了@DebugLog注解,可以修饰类、接口、方法和构造函数,可在 Class 文件中保留,编译期可用。更多关于 Java 注解的内容,请看之前的文章 探索注解之注解的基本概念。

阅读全文 »

AspectJ in Android (二),AspectJ 语法

发表于 2017-09-12 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

上篇文章介绍了 AspectJ 的基本概念,这篇文章详细分析 AspectJ 基于注解开发方式的语法。

Join Point

Join Point 表示连接点,即 AOP 可织入代码的点,下表列出了 AspectJ 的所有连接点:

Join Point 说明
Method call 方法被调用
Method execution 方法执行
Constructor call 构造函数被调用
Constructor execution 构造函数执行
Field get 读取属性
Field set 写入属性
Pre-initialization 与构造函数有关,很少用到
Initialization 与构造函数有关,很少用到
Static initialization static 块初始化
Handler 异常处理
Advice execution 所有 Advice 执行
阅读全文 »

AspectJ in Android (一),AspectJ 基础概念

发表于 2017-09-05 | 分类于 AspectJ | | 阅读次数

AspectJ in Android 系列:

AspectJ in Android (一),AspectJ 基础概念

AspectJ in Android (二),AspectJ 语法

AspectJ in Android (三),AspectJ 两种用法以及常见问题

最近项目在做无埋点统计,解决新增功能都需要人工添加埋点的问题,其中使用了 AspectJ 技术。在这过程中发现网上关于 AspectJ 在 Android 中应用的文章比较少,所以自己整理写了 《AspectJ in Android》系列文章,记录自己所学的同时希望读者可以少走一些弯路。

这篇文章主要讲 AspectJ 涉及到的 AOP 编程思想和 AspectJ 的一些基本概念。

AOP

什么是 AOP ?

AOP (Aspect-Oriented Programming),面向切面编程,是一种编程思想。AOP 以切面(aspect)为基础,切面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关点(crosscutting concern)。

AOP 和我们熟悉的 OOP 面向对象编程只有一字之差,面向对象编程是以对象为基础,把功能抽象成对象模型,优先从对象的属性和行为职责出发,把代码分散到一个个的类中,降低代码的复杂度同时提供复用性。但是在分散代码时会出现重复代码,例如,在两个类的每个方法中加上日志。按照 OOP 的思想,需要在方法中都加入重复的日志代码,也许有人说把日志代码抽象成例外一个日志的类,但是这样的话日志类和两个类都有耦合,而且日志类和这两个的职责没有关联,调用日志类的方法却遍布两个类的方法中。

而 AOP 的思想是把对象的核心职责外的通用逻辑(如日志,性能,校验等)抽象出来,把散布在多个对象多个模块的通用逻辑当作切面,然后动态地把代码插入到类的指定方法、指定位置中,实现 AOP 的核心技术也是代码织入技术,如 AspectJ、Javassist、DexMaker、ASMDex、动态代理等。

所以 AOP 可以说是对 OOP 的补充,OOP 以核心职责为主从纵向划分出一个一个类,AOP 以多个类中通用逻辑为主横向划分出一个一个切面,AOP 让 OOP 立体,去除重复代码,降低耦合并且增加可维护性。

阅读全文 »

Kotlin 设计模式之单例模式

发表于 2017-08-18 | 分类于 设计模式 | | 阅读次数

现在 Kotlin 的趋势日益高涨,Jake Wharton 大神近期从 Square 公司离职到 Google 负责 Kotlin 部分。我最近分析了 Kotlin 下的单例模式的实现方式,与 Java 下的实现有点区别,之前写过一篇 Java 设计模式之单例模式。

饿汉式

Kotlin 引入了 object 类型,可以很容易声明单例模式。

1
2
3
4
5
6
7
8
9
object Singleton {
...
}
// Kotlin 中调用
Singleton.xx()
// Java 中调用
Singleton.INSTANCE.xx()
阅读全文 »
1…456…16
Johnny Shieh

Johnny Shieh

我本微末,心向天空

76 日志
13 分类
43 标签
GitHub Weibo Gmail 简书
  • 热门系列
  • Dagger 完全解析(6)
  • AspectJ in Android(3)
  • Kotlin 写 Android 单元测试(4)
  • Kotlin 协程完全解析(5)
© 2015 - 2019 Johnny Shieh
访客数 访问量