文章目录
《Java设计模式》
一.软件设计模式的基本要素
- 模式名称
- 问题
- 解决方案
- 效果
二.模式和功能
根据目的来分
范围\目的 | 创建型模式 | 结构性模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
对象模式 | 单例 、原型、 抽象工厂、 建造者 | 代理 、(对象)适配器 、桥接、装饰、外观、享元 、组合 | 策略 、命令、指责链 、状态、观察者 、中介者、迭代器 、访问者 、备忘录 |
三.UML统一建模语言是什么
四.UML类图及类图之间的关系
注意:“可见性”表示该属性对类外的元素是否可见,包括公有(Public)、私有(Private)、受保护(Protected)和朋友(Friendly)4 种,在类图中分别用符号+、-、#、~表示。
五.类关系记忆技巧
六.UMLet的使用与类图的设计
七.什么才是优秀的软件架构
- 代码复用
- 扩展性
八.如何正确使用设计模式
九.面向对象设计原则
- 开闭原则
软件实体应当对扩展开放,对修改关闭。
意思是在需求改变时,不修改源代码,就可以扩展功能。这样的好处是多方面的,比如更易于测试、提高了代码的复用性、提高了软件的可维护性。 - 里氏替换原则
继承必须确保超类所拥有的性质在子类中仍然成立 - 依赖倒置原则
高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
要面向接口编程,不要面向实现编程 - 单一职责原则
单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分 - 接口隔离原则
一个类对另一个类的依赖应该建立在最小的接口上 - 迪米特法则
只与你的直接朋友交谈,不跟“陌生人”说话 - 合成复用原则
软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
记忆口诀:访问加限制,函数要节俭,依赖不允许,动态加接口,父类要抽象,扩展不更改。
十. 创建型模式
创建型的主要关注点时“怎样创建对象”,主要特点是“将对象的创建和使用分离”。
-
单例模式
1.1 某个类只能生成一个实例
1.2 懒汉模式(用的时候get的时候再new)与饿汉模式(类加载的时候就new,优点是无需考虑多线程) -
原型模式
将一个对象作为原型,通过对其复制而克隆出多个和原型类似的新实例
需要为每一个类配置一个clone方法(能源控制器里相关数据结构里有大量的clone方法,应该就是利用了原型模式实现)
优点:- Java自带的原型模式性能比直接new要好;
- 简化了创建对象的过程,还可付辅助实现撤销操作。
缺点: - 需要为每一个类配置一个clone方法(能源控制器里相关数据结构里有大量的clone方法,应该就是利用了原型模式实现);
- clone方法位于类内部,改造时需要修改代码,违背了开闭原则;
- 深克隆比较麻烦
-
工厂方法模式
定义一个用于创建产品的接口,由子类决定生产什么产品- 简单工厂方法就是给工厂传入参数,以决定产出什么产品。这违背了开闭原则,要加产品就得改工厂方法
- 工厂方法模式需要知道工厂名称,以生产出不同的产品。一个工厂只能生产一种产品,抽象工厂方法解决了这个问题。
-
抽象工厂方法
定义一个用于创建产品族的接口,其每个子类可以生产一系列相关的产品。 -
建造者模式
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建他们,最后构建成该复杂对象
- 建造者模式唯一区别与工厂模式的是针对复杂对象的创建。简单对象,考虑使用工厂模式,复杂对象考虑使用建造者模式。
十一. 结构型模式(描述如何将类或者对象结合在一起形成更大的结构,搭积木)
- 代理(Proxy)模式
- 静态代理 写代码,编译成class文件去执行,编译时决定
- 动态代理 利用反射,运行时决定
- 适配器模式
在接口不一致的情况下,为了使用而增加一层适配层 - 桥接模式
常见的使用场景是替换继承(使用关联关系组合或聚合替换继承关系)。 - 装饰模式
在不改变现有对象结构的情况下,动态地给该对象增加一些职责 - 外观模式
提供统一的接口 - 享元模式
利用共享技术实现大量细粒度对象的复用。通过共享已经存在的对象来减少需要创建的对象数量,避免大量相类似的开销,从而提高系统的资源利用率。
本质是缓存共享对象,降低内存消耗。 - 组合模式
又名整体-部分模式
十二.行为型模式概述(描述程序在运行是复杂的流程控制,既多个类或者对象怎样相互协作)
1.模板方法(Template Method)模式:
定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
2.策略(Strategy)模式:
定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
3.命令(Command)模式:
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
4.职责链(Chain of Responsibility)模式:
把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
5.状态(State)模式:
允许一个对象在其内部状态发生改变时改变其行为能力。
6.观察者(Observer)模式:
多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
7.中介者(Mediator)模式:
定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
8.迭代器(Iterator)模式:
提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
9.访问者(Visitor)模式:
在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
11.备忘录(Memento)模式:
在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
12.解释器(Interpreter)模式:
提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。