适配器模式(adapter: Adaptee+Adapter(实现接口))
将一个类的接口适配成用户所期待的,适配允许通常因为接口不兼容而不能在一起工作的类工作在一起
类适配器(继承) 对象适配器(组合) 组合优于继承
例:系统改造和升级;InputStreamReader与outpuStreamWriter(字节与字符转换)
UML(对象适配器):
代理模式(proxy :proxy(实现接口) + really(实现接口))
1)通过代理,控制对对象的访问,在方法调用前做前置处理,在方法调用后做后置处理
2)AOP(Aspect Oriented 面向切面编程 )的核心机制
3)应用场景 : 安全代理、远程代理、延迟加载
4)分类
静态代理:静态定义代理类
动态代理:动态生成代理类,自动生成
①JDK自带的动态代理
②javaassit字节码操作库实现
③CGLIB
④ASM(底层使用指令,可维护性较差)
UML(静态代理):
JDK自带的动态代理:
java.lang.reflect.Proxy(动态生成代理类和对象) 和 reflect.InvocationHandler(处理器接口)
①生成处理类
public class DynamicProObject implements InvocationHandler {
//实例对象
AllObject myObject = new ReallObject();
public DynamicProObject() {}
public DynamicProObject(AllObject myObject) {
super();
this.myObject = myObject;
}
//处理方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//对调用的方法做前置、后置处理
System.out.println("ago thing");
method.invoke(myObject, args);
System.out.println("after thing");
return null;
}
}
②动态生成代理类和对象
public static void main(String[] args) {
AllObject myObject = new ReallObject();
//生成处理器
DynamicProObject handler = new DynamicProObject(myObject);
//生成代理对象
AllObject neProxy = (AllObject)Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),
new Class[] {AllObject.class},handler);
//调用需要进行前置、后置处理的方法
neProxy.mainThing();
}
CGLIB动态代理:
桥接模式 (bridge:Implementor + Abstraction)
多继承结构:违反单一职责原则,扩展不方便
取代多继承的方案,将事物分为多个维度处理,提高了系统的可扩展性
example:JDBC驱动程序;AWT的peer架构
UML:
组合模式 (composite)
把部分和整体的关系用树形结构表示,使得客户端可以使用统一的方式处理部分对象和整体对象
Component:抽象构件,叶子结点和容器构件的共同点
Composite:容器构件,可以包含子节点
Leaf:叶子构件,无子节点
接口中所构建的方法是一个天然递归调用
UML: