Java设计模式精讲—课程笔记7
15 桥接模式讲解+Coding+源码解析
15.1 桥接模式讲解
- 定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化;
通过组合的方式建立两个类之间联系,而不是继承;
类型:结构型; - 适用场景:
抽象和具体实现之间增加更多的灵活性;
一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展;
不希望使用继承,或因为多层继承导致系统类的个数剧增; - 优点:
分离抽象部分及其具体实现部分;
提高了系统的可扩展性;
符合开闭原则;
符合合成复用原则; - 缺点:
增加了系统的理解与设计难度;
需要正确地识别出系统中两个独立变化的维度; - 相关设计模式:
桥接模式和组合模式:组合模式强调部分和整体间的组合,桥接模式强调平行级别上不同类的组合;
桥接模式和适配器模式:都是为了让两个东西配合工作,适配器模式是改变已有接口,桥接模式是分离抽象和具体实现,目的是分离;
15.2 桥接模式Coding
- 左侧:实现层;右侧:抽象层,Bank通过组合方式实现Account接口;
具体实现:Account的实现子类;
两边可以无限排列组合,各自发展;
- 注意点:具体实现不要都自己在抽象类中完成,要委托给实现类(抽象父类注入的实现类)实现;
否则:很可能不符合迪米特原则;
15.3 桥接模式源码解析(jdk)
- Driver实现类(com.mysql.jdbc)
- DriverManager和Driver间实现了桥接模式
16 代理模式讲解+Coding+源码解析
16.1 代理模式讲解
- 定义:为其他对象提供一种代理,以控制对这个对象的访问;
代理对象在客户端和目标对象之间起到中介的作用;
类型:结构型; - 适用场景:
保护目标对象;
增强目标对象; - 优点:
代理模式能将代理对象与真实被调用的目标对象分离;
一定程度上降低了系统的耦合度,扩展性好;
保护目标对象;
增强目标对象; - 缺点:
代理模式会造成系统设计中类的数目增加;
在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢;
增加系统的复杂度; - 扩展:
静态代理(在代码中显式定义业务实现类的代理,对同名业务方法进行包装,通过包装调用、增强目标方法);
动态代理(jdk中只能对接口进行代理,不能针对具体实现类,通过接口中的方法名,在动态生成的类中调用同名方法);
CGLib代理(针对类实现进行代理,代理类时会生成被代理类的子类,继承重写类中方法,需格外关注final修饰符使用情况); - Spring代理选择-扩展:
当Bean有实现接口时,Spring就会用JDK的动态代理;
当Bean没有实现接口时,Spring使用CGLib;
可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=”true”/>)
参考资料:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html - 代理速度对比-扩展:
CGLib:底层使用svm字节码生成,比使用java反射效率高;
JDK动态代理:原生代理实现;
速度对比:万次执行情况下,JDK7、8快20%左右; - 代理-相关设计模式:
代理模式和装饰者模式:装饰者模式是为对象加上行为,代理模式是控制访问,注重通过设置代理人方式增强目标对象,一般通过增强目标对象行为进行增强;
代理模式和适配器模式:适配器模式改变对象接口,代理模式不能改变所代理对象接口。
16.2 代理模式Coding-静态代理
更合适的划分:(SaveOrder是为了增强saveOrder)
2. 看源码包的技巧:
16.3 代理模式Coding-动态代理
- 动态代理是动态生成的,核心:生成一个新类;
不仅针对特定实体(Order),(抽奖信息、订单等)都可以通过一个动态代理复用,不用每个都写一套对应的静态代理。
beforeMethod:确定数据库;
proxy是动态生成的代理类,后面的method和arg来自proxy:
16.4 代理模式源码解析(jdk+spring+mybatis)
- jdk:java.lang.reflect.proxy
spring:ProxyFactoryBean、jdkDynamicAopProxy、CglibAopProxy
mybatis:MapperProxyFactory(运用jdk原生代理) - 代理模式因为动态特性,应用广泛,为学习其他框架帮助较大;
17 模板方法模式讲解+Coding+源码解析
17.1 模板方法模式讲解
- 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现;
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤;
类型:行为型; - 适用场景:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复; - 优点:
提高复用性;
提高扩展性;
符合开闭原则; - 缺点:
类数目增加;
增加了系统实现的复杂度;
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍; - 扩展:
钩子方法:提供了缺省的行为,子类可以在必要时进行扩展(模板对子类进一层的开放和扩展); - 相关设计模式:
模板方法模式和工厂方法模式:工厂方法模式是模板方法模式的一种特殊实现;
模板方法模式和策略模式:都有封装算法,策略模式目的是使不同算法可以相互替换且不影响应用层客户端的使用,模板方法模式针对定义方法流程并将不同的具体实现步骤交给子类实现;模板方法模式不改变算法流程,策略模式可以改变算法流程并可以互相替换。
17.2 模板方法模式coding
- 模板方法(makeCourse)一定要加final:
- 将方法开放给外部:
17.3 模板方法源码解析(jdk+servlet+mybatis)
- jdk:AbstractList
servlet:HttpServlet
mybatis:BaseExecutor