写点什么

学习总结—第三周

用户头像
于江水
关注
发布于: 2020 年 06 月 23 日

要想学习和掌握设计模式,其实知道设计模式的起源和发展的流程即可:

当来了需求或者工作,开始进行开发,开发过程中发现遵循一定的规则或者规律来设计 API 提供功能以及解决特定问题会比较轻松和简单,将其抽象变成一种模式,得到设计模式。



以上是设计模式的起源,由此可以得知:

  1. 设计模式是一种可复用的解决方案

  2. 设计模式是针对特定问题和场景而言的,需要先梳理清楚需求、问题等,再去思考合理可用的设计模式

  3. 设计模式没有银弹,各有利弊,需要根据场景选择最合适的



由此可以进一步推出设计模式的组成部分:

  1. 模式的名称

  2. 待解决的问题:适用于什么场景解决什么问题

  3. 解决方案:设计什么样的元素?元素之间的关系职责和交互?

  4. 结论:使用这个模式的利弊



由此可以进一步推导出设计模式的学习方法:

  1. 按需学习:设计模式太多了,而且非常抽象,很容易出现一看就懂,一做就忘。最好按需学习,然后在实际工作中反复实践加强理解。

  2. 注重理解使用场景和问题。

  3. 结合工作场景反复实践加深理解。



常见设计模式

简单工厂

问题:我想要调用一个东西,我知道它的 API,我不想了解它的实现。此外还有一系列跟它相似 API 的东西,但是我只想通过简单的方式去调用。

实际问题:我想要调用一个 sorter 来对我的数据进行排序,我知道所有的 sorter 都会有 sort 方法,但是针对不同数据类型以及排序方式会有不同的排序方法,可是我并不想在乎这些细节。

实现原理:

对于我的 Client 的业务代码,我只知道所有 sorter 遵循一个固定的 interface。对于 sorter 的开发者,他们也需要遵循这个 interface 去开发 sorter。当我调用的时候,我并不想直接调用对应的 sorter,我就可以通过一个中间层去获取这个 sorter 然后根据 interface 的定义去调用即可:

public class SorterFactory {
public static <T> Sorter<T> getSorter(sorterName) {
if (sorterName == 'BubbleSorter') {
return new BubbleSorter<T>();
} else if (xxx) {
return xxx
}
}
}

public class Client {
public static void main(String[] args) {
Sorter<Integer> bubbleSorter = SorterFactory.getSorter('BubbleSorter');
bubbleSorter.sort(xxx)
Sorter<Integer> xxxSorter = SorterFactory.getSorter('xxx');
xxxSorter.sort(xxx)
}
}



单例模式

问题:整个项目共享一个变量一个实例,都对其进行读取或者一些操作。

实际问题:整个项目中,我想复用一个实例进行统一的数据存取。

实现原理:创建一个 Class 禁止实例化,通过 getInstance() static 方法获取唯一的实例引用,然后进行调用和使用。

public class Singleton {
private Singleton() {}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}



其他的模式都按照这种方式去学习、分析、理解即可,这里不再赘述。

发布于: 2020 年 06 月 23 日阅读数: 54
用户头像

于江水

关注

还未添加个人签名 2018.07.08 加入

还未添加个人简介

评论

发布
暂无评论
学习总结—第三周