享元设计模式
享元设计模式(Flyweight Pattern)描述: 享元设计模式主要用于减少对象的创建,以减少内存的占用提高性能这种类型的设计模式属于结构型模式,它减少了对象的数量从而改善应用所需的对象结构的方式
核心思想: 主要的思想和池化技术的概念类似。当我们取对象时如果有就返回,没有就创建。
使用场景:
系统有大量的相似对象
有缓冲池的场景
享元设计模式的优点:
降低内存的消耗,提高使用率
享元设计模式的缺点:
提高了系统的复杂度,需要分理处外部状态和内部的状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。
示例:
抽象享元对象
123interface Book { void borrow();}
享元对象的实现
12345678910111213class CreateBook implements Book { private String name; public CreateBook(String name) { this.name = name ...
外观设计模式
外观设计模式(Facade pattern)描述: 外观设计模式就是隐藏系统的复杂性,向客户端提供一个客户端可以访问系统的接口,这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂度
核心思想: 封装系统的复杂度,对外提供简单的接口
使用场景:
为复杂的模块或者子系统提供外界访问的接口
子系统相对的独立
外观设计模式的优点:
减少系统相互依赖
提高灵活性
提高安全性
外观设计模式的缺点:
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
示例:
接口类
123public interface Shape { void draw();}
实现接口
1234567public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle::draw()"); }}
1234567public cl ...
组合设计模式
组合设计模式(Composite Pattern)描述: 组合设计模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表时部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象的树形结构
核心思想: 将对象组合成树形结构以表示“部分—整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用一致性。
使用场景:
您想表示的部分-整体层次结构
您希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象
组合设计模式的优点:
高层模块表用简单
节点自由增加
组合设计模式的缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
示例:
创建一个对象
1234567891011121314151617181920212223242526272829303132public class Employee { private String name; private String dept; private int salary; privat ...
桥接设计模式
桥接设计模式(Bridge Pattern)描述: 桥接设计模式是用于把抽象化于实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型设计模式,它通过提供抽象化和实现化之间的桥接结构来实现二者的解耦。
核心思想: 将抽象部分与实现部分分离,使它们可以独立的变化
使用场景:
如果一个系统需要在构建的抽象和具体角色化之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系通过桥接模式可以使它们在抽象层建立一个关联关系。
对于那些不希望使用继承或者因为多层次导致导致的系统类的个数急剧增加的系统,桥接模式尤为适用
一个类存在两个独立变化的维度,且这两个类都需要进行扩展。
桥接设计模式的优点:
抽象和实现的分离。
优秀的扩展能力。
实现细节对客户透明。
桥接设计模式的缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
示例:
目标接口。
123public interface DrawAPI { void drawCircle(int radius, int x, int y); ...
适配器设计模式
适配器设计模式(adapter pattern)描述: 适配器设计模式主要用于接口的转化或者将接口不兼容的类对象组合在一起形成对外统一的接口,是一种结构性模式其本质是一种中间件,适用于类和对象。
核心思想: 对现有的接口进行转化以符合新的需求
使用场景:
想用一个已经存在的类,但其接口不符合需求;
想创建一个可以复用的类,该类可以与其他不相关的类协同工作;
想使用一些已经存在的子类,但是不能对每一个都进行子类化以匹配它们的接口(仅适用于对象Adapter)。对象适配器可以适配他的父类接口。
适配器设计模式的优点:
提高了类的复用;
组合若干关联对象形成对外提供统一服务的接口;
扩展性、灵活性好。
适配器设计模式的缺点:
过多使用适配模式容易造成代码功能和逻辑意义的混淆。
部分语言对继承的限制,可能至多只能适配一个适配者类,而且目标类必须是抽象类。
适配器设计模式的分类:
类适配器
对象适配器
接口适配器
示例:
类适配器
定义目标接口类:Target
123public interface Target { void request(); ...
Java中的深克隆和浅克隆
Java中的深克隆和浅克隆浅克隆: 创建一个新对象,新对象的属性和原来对象完全相同(新对象的地址 != 原来对象的地址),对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。**(String 类型除外)**。
深克隆: 创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
浅克隆示例:
1234class student { private String name; private Integer age;}
123456789101112131415161718class teacher implements Cloneable { private int[] drive; private String name; private Integer age; private String sex; private student stu; @Override public Object clone() { Object clone = null; ...
原型设计模式
原型设计模式(Prototype Pattern)描述: 它是用来创建重复对象的,首先创建一个实例然后通过这个实例拷贝创建新的实例
核心思想: 使用克隆的方式进行对象的创建
使用场景:
一个复杂的对象,包含多种数据和结构,层次较深时,适用与原型模式(当需要创建一个与复杂对象部分数据相同的对象)
当复杂对象需要独立于系统运行,而不破坏本系统中的结构
一个对象多个修改者的场景。
原型设计模式的优点:
性能提高。
逃避构造函数的约束。
原型设计模式的缺点:
引用含有循环引用如何处理
必须实现 Cloneable 接口。
示例:
123456789101112131415class student implements Cloneable { private String name; private Integer age; @Override public Object clone() { Object clone = null; try { clone = su ...
责任链设计模式
责任链设计模式(Chain of Responsibility Pattern)描述: 责任链设计模式属于行为型模式,在这种模式中通常每个接收者都包含对另一个接收者的调用。
从而形成链式调用
核心思想: 避免请求发送者于接收者耦合在一起,让多个都有可能接收请求,将这些对象链接成一条链,并且沿着这条链传递请求。直到对象处理完为止。
使用场景:
有多个对象可以处理同一个请求,具体那个对象处理改请求由运行时决定
在不明确指定接收者的情况下,向多个对象中的一个对象提交一个请求
可动态的指定一组对象处理请求
责任链设计模式的优点:
降低耦合度。它将请求的发送者和接收者解耦。
简化了对象。使得对象不需要知道链的结构。
增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
增加新的请求处理类很方便。
责任链设计模式的缺点:
不能保证请求一定被接收。
系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
可能不容易观察运行时的特征,有碍于除错。
示例:
现在有需求有一个字符串需要对它进行处理, 替换敏感字符, 特殊符 ...
观察者设计模式
观察者设计模式(Observer Pattern)描述: 当对象存在一对多的关系时,使用观察者设计模式。比如一个对象被修改时,则会通知依赖他的对象。观察者设计模式属于行为行设计模式
核心思想: 当一个对象发生变化时通知其他依赖它的对象
使用场景:
一个对象改变一个或多个对象也发生变化,而不知道有多少对象发生变化,降低对象之间的耦合度。
一个对象必须通知其他的对象,而不知道这些对象都有谁
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
观察者设计模式优点:
观察者和被观察者时抽象解耦的
建立一套触发机制
观察者设计模式缺点:
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化 ...
装饰器设计模式
装饰器设计模式(Decorator Pattern)描述: 装饰器设计模式就是给对象动态的添加职责,行为的,它是用来代替继承的。相比于继承它更显得灵活。
核心思想: 一般情况下当我们要扩展一个类的时候会使用继承,但这不是很安全,随着功能的增加子类会爆炸式的增长。
装饰器设计模式的优点: 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
装饰器设计模式的缺点: 多层装饰比较复杂。
装饰器设计模式的使用场景:
扩展一个类的功能。
动态增加功能,动态撤销
示例:
动物的抽象接口
1234public interface Animal { // 一个吃的方法 void eat();}
猫实现动物接口
12345public class Cat implements Animal { public void eat() { System.out.println("wo是猫,在吃饭"); }}
装饰 ...