第三章 设计模式入门
核心是解耦合提高复用性
列举面向对象设计原则并说明核心思想
1.单一职责
2.开闭原则
3.里式替换原则
4.依赖倒置原则
6.地雷特法则
7.合成复用原则
代理模式的作用
设计模式简介
对某些特定问题的经过实践检查的特定解决方法,应用在Java框架技术中
优点 复用,便于团队交流
设计模式分类
GoF(四人组)设计模式
分为23钟
范围目的 | 创建型模式 | j结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法 | (类)匹配器 | 模板方法 解释器 |
对象模式 | 单例 原型 抽象工厂 建造者 | 代理 (对象)适配器 桥接 装饰 外观 享元 组合 | 策划 |
列举面向对象设计原则并说明核心思想
1.单一职责
1.一个类应该有且仅有一个引起他变化的原因
2.一个类应该只负责一个职责
2.开闭原则
1.对扩展开放,对修改关闭
-
面向抽象接口开发,不面对具体事例类开发
-
添加实现类,而不是修改类
3.里式替换原则
-
引用基类的地方必须能透明使用其子类的对象
-
可以用来判断继承关系是否合理
4.依赖倒置原则
-
依赖于抽象而不依赖于具体实现,针对接口编程
5.接口隔离
1.尽量将庞大的接口拆分成更小的 更具体的接口
2.接口中只包含感兴趣的方法
6.迪米特法则 (最少知道原则)
1.尽可能地于减少其他实体发生互相作用
7.合成复用原则
1.尽量使用组合/聚合的方式,而不是继承关系
2.has-a关系
设计模式的应用
简单工厂模式
工厂 负责创建所有实例 根据传入的参数
抽象产品
具体产品
优点
1.基于多台,便于对负责逻辑进行封装管理
2.满足开闭原则
缺点复杂
代理模式
1.单一职责原则的体现
2.包含抽象主题 真实主题 代理
3.实现方式总体分为静态代理和动态代理
静态代理由开发者针对抽象主题编写相关的代理实现,编译之前生成代理类的.class文件
动态代理实在运行时动摇生成的,在运行时动态生成代理类字节码
静态弊端
增加代码量且不符合开闭原则
动态代理
优点
1.提供了运行时动态扩展对象行为的能力
2.能够根据给定的业务规则,在运行时生成代理类
核心API
方法 | 介绍 |
---|---|
Object invoke(Object target,Method method,Object[] args) | 用于在代理实例上处理方法调用并返回结果。target代理正在执行方法的对象,正在被调用的接口方法,args传递给接口方法 的参数。 |
static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h) | 返回一个实现了指定接口的代理实例,对接口方法的调用会被指派掉指定的调用处理程序。loader用来加载动态生成的代理类,h是接口代理方法的调用处理程序,interfaces需要进行代理的接口类型 |
动态代理框架
抽象主题类
public interface Buyer {//抽象主题类
String add();//看房方法
}
真实主题类
public class RealBuyer implements Buyer{//真实主题类
代理工厂类 创建一个create方法
import java.lang.reflect.Proxy;
public class IntermadiaryJDKProxyFactory {//代理工厂类
public static <T> T create(Object object){
IntermadiaryInvocationHandler handler = new IntermadiaryInvocationHandler();
handler.setTarget(object);
return (T)Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);
}
}
中介代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class IntermadiaryInvocationHandler implements InvocationHandler {//实现代理对象
private Object target;//被代理的对象
public void setTarget(Object target) {//调用set方法
this.target = target;
}
测试类
public class Test {
public static void main(String[] args) {
Buyer buyer= IntermadiaryJDKProxyFactory.create(new RealBuyer());
System.out.println(buyer.add());
}
}