设计模式之美

https://time.geekbang.org/column/intro/100039001

设计模式学习导读 (3讲)

 

01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?

02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?

03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?

设计原则与思想:面向对象 (11讲)

 

04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?

05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?

https://time.geekbang.org/column/article/161114

封装

1. 关于封装特性封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。封装特性存在的意义,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。

抽象

2. 关于抽象特性封装主要讲如何隐藏信息、保护数据,那抽象就是讲如何隐藏方法的具体实现,让使用者只需要关心方法提供了哪些功能,不需要知道这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、维护性,修改实现不需要改变定义,减少代码的改动范围;另一方面,它也是处理复杂系统的有效手段,能有效地过滤掉不必要关注的信息。

继承

3. 关于继承特性继承是用来表示类之间的 is-a 关系,分为两种模式:单继承和多继承。单继承表示一个子类只继承一个父类,多继承表示一个子类可以继承多个父类。为了实现继承这个特性,编程语言需要提供特殊的语法机制来支持。继承主要是用来解决代码复用的问题。

多态

4. 关于多态特性多态是指子类可以替换父类,在实际的代码运行过程中,调用子类的方法实现。多态这种特性也需要编程语言提供特殊的语法机制来实现,比如继承、接口类、duck-typing。多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础

class Logger:
    def record(self):
        print("I write a log into file.")
        
class DB:
    def record(self):
        print("I insert data into db.")
        
def test(recorder):
    #2个没有关系的类,只要实现了相同的方法,就可以通过test调用对应类实例的同名方法,在没有继承的情况下,实现多态
    recorder.record()

def demo():
    logger = Logger()
    db = DB()
    test(logger)
    test(db)


if __name__ == "__main__":
    demo()

06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?

07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?

08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?

09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?

10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?

11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?

13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?

14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?

设计原则与思想:设计原则 (12讲)

 

15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?

16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?

17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?

18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?

19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?

20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?

21 | 理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?

22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?

23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?

24 | 实战一(下):如何实现一个遵从设计原则的积分兑换系统?

25 | 实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?

26 | 实战二(下):如何实现一个支持各种统计规则的性能计数器?

设计原则与思想:规范与重构 (7讲)

 

27 | 理论一:什么情况下要重构?到底重构什么?又该如何重构?

28 | 理论二:为了保证重构不出错,有哪些非常能落地的技术手段?

29 | 理论三:什么是代码的可测试性?如何写出可测试性好的代码?

30 | 理论四:如何通过封装、抽象、模块化、中间层等解耦代码?

31 | 理论五:让你最快速地改善代码质量的20条编程规范(上)

https://time.geekbang.org/column/article/188622

32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)

https://time.geekbang.org/column/article/188857

33 | 理论五:让你最快速地改善代码质量的20条编程规范(下)

https://time.geekbang.org/column/article/188882

34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题

35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”

36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

37 | 实战二(下):重构ID生成器项目中各函数的异常处理代码

设计原则与思想:总结课 (3讲)

 

38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点

39 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(上)

40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(下)

设计模式与范式:创建型 (7讲)

41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?

使用场景:

1、处理资源访问冲突

2、表示全局唯一类

业务上需要将一些数据保持全局唯一,比如:

 配置信息

 IdGenerator,当要求生成id必须全局唯一时(分布式系统id生成器)

为什么会出现多线程访问共享资源是的竞争问题?

 对象级别的锁

重点回顾好了,今天的内容到此就讲完了。我们来总结回顾一下,你需要掌握的重点内容。

1. 单例的定义单例设计模式(Singleton Design Pattern)理解起来非常简单。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。

2. 单例的用处从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类。比如,系统的配置信息类。除此之外,我们还可以使用单例解决资源访问冲突的问题。

3. 单例的实现单例有下面几种经典的实现方式。饿汉式饿汉式的实现方式,在类加载的期间,就已经将 instance 静态实例初始化好了,所以,instance 实例的创建是线程安全的。不过,这样的实现方式不支持延迟加载实例。懒汉式懒汉式相对于饿汉式的优势是支持延迟加载。这种实现方式会导致频繁加锁、释放锁,以及并发度低等问题,频繁的调用会产生性能瓶颈。双重检测双重检测实现方式既支持延迟加载、又支持高并发的单例实现方式。只要 instance 被创建之后,再调用 getInstance() 函数都不会进入到加锁逻辑中。所以,这种实现方式解决了懒汉式并发度低的问题。静态内部类利用 Java 的静态内部类来实现单例。这种实现方式,既支持延迟加载,也支持高并发,实现起来也比双重检测简单。枚举最简单的实现方式,基于枚举类型的单例实现。这种实现方式通过 Java 枚举类型本身的特性,保证了实例创建的线程安全性和实例的唯一性。 

42 | 单例模式(中):我为什么不

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值