Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain OfResponsibleity(责任链模式)
JDK动态代理
HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if ("getParameter".equalsIgnoreCase(method.getName())) { // 对getParammet方法进行增强 if ("get".equalsIgnoreCase(request.getMethod())) { //对get请求进行转码 String invoke = (String) method.invoke(request, args); // 对获得的值进行转码 invoke = new String(invoke.getBytes("iso8859-1"),"utf-8"); return invoke; } else { // 不做处理 } } return method.invoke(request, args); } });
Cglib动态代理
public class TestCglibDynamicProxy { public static void main(String[] args) { //1.获得被代理的对象 See see = new SeeChild(); ProxyClassCglib pr = new ProxyClassCglib(see); See creatSee = pr.creatSee(); creatSee.see(); } } class ProxyClassCglib implements MethodInterceptor{ //1.创建一个用来接收代理类对象的成员变量 private See see; //2.设置构造 public ProxyClassCglib(See see){ this.see = see; } /** * 增强指定方法 */ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if("see".equals(method.getName())){ /** * methodProxy.invokeSuper(proxy, args); * 执行当前代理类的父类中的see的对应方法 * method.invoke(see, args); * 执行被代理类的对应方法 */ method.invoke(see, args); methodProxy.invokeSuper(proxy, args); System.out.println("增强see"); return null; } return method.invoke(see, args); } //4.返回代理对象 public See creatSee(){ //1.创建Cglib核心文件 Enhancer enhancer = new Enhancer(); //2.设置父类(设置父类的话,如果设置为父类.class,可以在增强方法中即可调用当前类的方法,也可以调用代理类对应的方法;如果设置代理对象.class,则只可以在增强方法中执行代理对象中对应的方法) enhancer.setSuperclass(See.class); //3.设置回调Callback类型,Callback应该是个MethodInterceptor的父接口,没有源码、、 enhancer.setCallback(this); //4.生成代理类 See see = (See) enhancer.create(); //返回代理对象 return see; } }