代理模式:为对象提供一个代理以控制对该对象的访问
作用:增加或者减少服务
实现方式:
1、继承 静态代理 不推荐使用 高耦合度
2、关联方式 静态代理 依赖 接口 有一个接口,真实类实现该方法,代理类也实现该方法,并且真实类是代理类的一个属性
抽象类 -》真实类 -》代理类 耦合度低
3、动态代理 反射机制 动态创建类 JDK动态代理类:
实现接口 InvocationHandler 方法 Object invoke()
参数:被代理对象 执行的方法 方法参数
Proxy类 newProxyInstance()
参数: 被代理的类加载器 被代理实现的所有接口 一个代理类处理逻辑的地方
代理的处理方法:
- 代理类与真实类继承自同一接口
- 代理对象持有真实对象的引用
- 代理的方法与被代理的方法要求同样的声明
- 方法体插入代理类自有代码《可选》
- 方法体调用真实类方法
- 方法体插入代理类自有代码《可选》
- 代理类允许有自己的方法
装饰模式:
类似于BufferedOutputStream和OutPutStream之间的关系
装饰模式的处理方法;
- 构建原始类
- 构建装饰类,持有原始类的对象为属性
- 在构造方法中将原始类对象传入
- 构建同样的方法声明,在方法体中调用原始类方法,再添加其它方法
- 装饰类允许有自己的方法
关于类的功能扩展的几种方式的区别:
1、代理模式:主要是控制访问
2、装饰模式:主要是增加功能
3、继承:增加功能,增加属性
工厂模式:根据传入参数的不同而返回不同的实际对象。
工厂模式的处理方法:
- 有一个工厂类,工厂类持有需要生产的产品的引用,并且提供一个静态的返回值为产品接口的带参数的方法
- 有一个接口(或者抽象类,一般不为类),该接口是工厂需要生产的产品
- 至少有一个类实现了该接口,实现该接口的所有方法,也许每个实现类的方法是不一致的,一般情况下他不具有接口定义以外的方法
- 在工厂类的静态方法中,通过判断传入的参数来决定返回值得不同,返回值是直接创建一个对应的产品对象
优势:在新增一个类的时候,只需要在方法中添加一个判断条件即可。
可以动态改变返回的对象值