Java设计模式精讲—课程笔记5
9 原型模式讲解+Coding+源码解析
9.1 原型模式讲解
- 定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;
特点:不需要知道任何创建的细节,不调用构造函数;
类型:创建型; - 适用场景:
类初始化消耗较多资源;
new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等);
构造函数比较复杂;
循环体中生产大量对象时; - 优点:
原型模式性能比直接new一个对象性能高;
简化创建过程; - 缺点:
必须配备克隆方法;(标识、重写克隆方法)
对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险;
深拷贝、浅拷贝要运用得当; - 扩展:
深克隆、浅克隆;
9.2 原型模式coding
- 原型模式:在内存中进行二进制流的拷贝
类实现克隆功能:添加Cloneable接口,重写克隆方法clone(): Object;
克隆时并未调用原构造器,只调用了克隆方法;
- 另一种方法:通过抽象类实现原型模式;
A可克隆,B继承A后自然也可克隆;
- 浅克隆:只克隆当前层次,可能引用了同一个对象
- 深克隆:单独克隆引用对象
9.3 原型模式coding—克隆破坏单例
- 克隆模式可以破坏单例
- 解决方法:单例类不实现克隆接口,或在克隆中直接实现getInstance() 方法。
9.4 原型模式源码解析
- Object -> clone()
- 写一个Cloneable接口,ctrl + T 能看到实现的接口
- ArrayList、HashMap等
- 使用原型模式要注意对象是深克隆or浅克隆。
10 外观模式讲解+Coding+源码解析
10.1 外观模式讲解
- 定义:又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口;
外观模式定义了一个高层接口,让子系统更容易使用;
类型:结构型; - 适用场景:
子系统越来越复杂,增加外观模式提供简单调用接口;
构建多层系统结构,利用外观对象作为每层的入口,简化层间调用; - 优点:
简化了调用过程,无需了解深入子系统,防止带来风险;
减少系统依赖、松散耦合;、
更好的划分访问层次;
符合迪米特法则,即最少知道原则; - 缺点:
增加子系统、扩展子系统行为容易引入风险;
不符合开闭原则(增加、扩展子系统时); - 相关设计模式:
外观模式和中介者模式(外观模式关注外界和子系统交互,中介者模式关注子系统内部之间的交互);
外观模式和单例模式(通常将外观模式中的外观对象做成单例模式);
外观模式和抽象工厂模式(外观类可通过抽象工厂获取子系统实例,从而使子系统在内部对外观类屏蔽)。
10.2 外观模式coding
- 对外部只和外观类通讯,不需关注子系统。
- 实际使用时test可以只和外观类联系(此处由于未集成spring),可调整为
- 标准外观类子系统UML:(应用层、子系统都只和外观类通信,不直接通信)
- 此时并不符合开闭原则;
还可通过抽象外观类实现(需频繁添加子系统时,可符合开闭原则);
10.3 外观模式源码解析(springjdbc+myabtis+tomcat)
- springjdbc :JdbcUtils
- myabtis :Configuration
- tomcat:RequestFacade
11 装饰者模式讲解+coding+源码解析
11.1 装饰者模式讲解
- 定义:在不改变原有对象的基础之上,将功能附加到对象上;
提供了比继承更有弹性的替代方案(扩展原有对象功能);
类型:结构型; - 适用场景:
扩展一个类的功能或给一个类添加附加职责;
动态地给一个对象添加功能,这些功能可以再动态地撤销; - 优点:
继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能;
通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果;
符合开闭原则; - 缺点:
会出现更多的代码,更多的类,增加程序复杂性;
动态装饰时,多层装饰时会更复杂; - 相关设计模式:
装饰者模式和代理模式(装饰者模式关注对象动态添加方法,代理模式关注控制对对象的访问)(代理模式常常在代理类中创建对象实例,装饰者模式通常会将原始对象作为参数传递给装饰者构造器);
装饰者模式和适配器模式(都可以叫做包装模式,装饰者和被装饰者可以实现相同的接口或为子类,适配器和被适配的类可以实现不同的接口;装饰者模式可以退化为半装饰者);
11.2 装饰者模式coding
- 装饰者模式:抽象的实体类、具体的实体类、抽象的装饰类、具体的装饰类;
- 抽象的装饰者:如果能保证子类一定实现某方法,抽象的装饰者才有意义;
根据实际需求确定是否需要抽象的装饰者;
11.3 装饰者模式源码解析(spring-session mybatis jdk servlet)
- java.io -> BufferedReader、BufferedInputStream
FilterInputStream:抽象装饰者;
LineInputStream等:实体装饰者; - spring -> TransactionAwareCacheDecorator
Cache的装饰者; - spring-session -> SessionRepositoryRequestWrapper
- 装饰者和适配器都可称为包装器,结尾都可能是Wrapper,具体需看类内结构。
- mybatis -> Cache,decorators包