设计模式笔记目录
1. 设计原则简述
1.1 基本原则
(1)KISS(Keep It Simple Stupid)原则
KISS原则目的:在设计和编码中,尽量保持代码简约,避免不必要的复杂。
(2)DRY(Don't Repeat Yourself)原则
DRY原则目的:抽取系统公共部分,放置在一个地方避免重复。
DRY原则适用:代码、功能和业务逻辑设计,对系统分割,每个功能之间界限清晰,用例之间不交叉。
(3)Tell,Don't Ask原则
Tell,Don't Ask原则要求:与封装有关,要求对代码进行合理封装,并放到合理的类中。
Tell,Don't Ask原则指出:明确对象要执行的操作,而不是先询问对象状态再决定执行操作。
(4)YAGNI(You Ain't Gonna Need It)原则
YAGNI原则指出:系统中只包含必需的功能,不包含认为将来可能用到的功能或特性,防止过度设计。
YAGNI原则应用:TDD。在TDD中,首先写出系统必须功能的测试用例,再实现系统功能代码,然后进行测试,直至测试代码通过。
(5)SoC(Separation of Concerns)原则
SoC原则:把功能分离为单独功能点,每个功能点有唯一的行为和数据,每个功能点均能被其他需要的类使用。
SoC原则最大限度实现代码重用、功能重用、模块重用。
1.2 S.O.L.I.D原则
Robert Martin提出的S.O.L.I.D 原则包括:单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)。
第24章 单一职责原则(Single Responsibility Principle)
第25章 开闭原则(Open Close Principle)
第26章 里氏替换原则(Liskov Substitution Principle)
第27章 接口隔离原则(Interface Segregation Principle)
第28章 依赖倒置原则(Dependence Inversion Principle)
第29章 迪米特法则(Low Of Demeter)
2. 23种设计模式
设计模式简介
2.1 创建型模式(Creational Patterns)
创建型模式:用来进行对象创建的的模式。
创建型模式目标:简化对象的创建和方便对象的管理。
◊ 创建型模式(Creational Pattern)关注对象的创建过程
◊ 创建型模式对类的实例化过程进行抽象,将对象的创建和对象的使用分离,对用户隐藏类的实例的创建细节。
◊ 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。
创建型模式关注点在于创建对象和使用对象,包括:
◊ 创建什么(What)
◊ 由谁创建(Who)
◊ 何时创建(When)
工厂模式主要用于创建独立的、相互无关联的大量对象;
抽象工厂模式用于成套对象的一次性创建;
建造者模式用于创建步骤文档,但创建步骤中的元素易变的对象的创建;
单件模式用于创建必须唯一的实例;
原型模式用于创建大量相同或相似的对象。
第2章 建造者模式(Builder)
第4章 原型模式(Prototype)
第5章 单件模式(Singleton)
2.2 结构型模式(Structural Patterns)
结构型模式讨论的是类和对象的结构,采用继承机制来组合接口(类结构型模式)或者通过组合一些对象,从而实现新的功能(对象结构型模式)。
适配器模式是通过类的继承或者对象的组合侧重与转换已有的接口;桥接模式是通过将抽象和实现分离,让它们可以分别独立地变化,它强调的是系统沿着多个方向的变化;装饰模式采用对象组合而非继承的手法,实现在运行时动态的扩展对象功能的能力,它强调的是扩展接口;组合模式模糊了简单元素和复杂元素的概念,它强调的是一种层次式的结构;外观模式将复杂系统的内部子系统与客户程序之间的依赖解除,它侧重于简化接口,更多的是一种架构模式;享元模式解决由于存在大量的细粒度对象而造成不必要的内存开销的问题,它与外观模式恰好相反,关注的重点是细小的对象;代理模式为其他对象提供一种代理以控制对这个对象的访问,它侧重于增加间接层来简化复杂的问题。
适配器模式和桥接模式具有一些共同的特征:他们都给另一对象提供了一定程度上的间接性,因而有利于系统的灵活性;它们都涉及从自身以外的一个接口向这个对象转发请求。这两种模式的不同之处主要在于它们各自的用途。适配器模式主要是为了解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实现的;而另一方面,桥接模式则对抽象接口与它的实现部分进行桥接。虽然这一模式允许修改实现它的类,但仍然为用户提供了一个稳定的接口。桥接模式也会在系统演化时适应新的实现。它们的区别在于:外观Facade定义了一个新的接口,而适配器Adapter则复用了一个原有的接口。
装饰模式和组合模式都基于递归组合来组织可变数目的对象,两个模式的目的不同。装饰旨在使你能够不需要生成子类即可给对象添加职责。这样避免了静态实现所有功能组合,从而导致子类急剧增加。组合模式则由不同的目的,它旨在构造类,使多个相关的对象能够以统一的方式处理,而多重对象可以被当作一个对象来处理。它重点不在修饰,而在表示。另一种与装饰模式结构类似的模式是代理模式,这两种模式都描述了怎样为对象提供一定程度上的间接引用,Proxy和Decorator对象的实现部分都保留了指向另一个对象的指针,它们向这个对象发送请求。同样它们具有不同的设计目的,代理模式构成一个对象并为用户提供一致的接口,但代理模式不能动态添加或分离性质,它也不是为递归组合而设计的。它的目的是,当直接访问一个实体不方便或不符合需要时,为这个实体提供一个替代者。
第6章 适配器模式(Adapter)
第7章 桥接模式(Bridge)
第8章 组合模式(Composite)
第9章 装饰模式(Decorator)
第10章 外观模式(Facade)
第11章 享元模式(Flyweight)
第12章 代理模式(Proxy)
2.3 行为型模式(Behavioral Patterns)
行为型设计模式及算法和对象之间职责的分配。行为型设计模式不仅仅描述对象或类的模式,还描述它们之间的通信模式。行为型设计模式使用对象复合而不是继承。
第13章 职责链模式(Chain of Responsibility)
第14章 命令模式(Command)
第15章 解释器模式(Interpreter)
第16章 迭代器模式(Iterator)
第17章 中介者模式(Mediator)
第18章 备忘录模式(Memento)
第19章 观察者模式(Oberver)
第20章 状态模式(State)
第21章 策略模式(Strategy)
第23章 访问者模式(Visitor)