Java常用设计模式

Java常用设计模式,第1张

Java常用设计模式

功能性代码:模板算法,业务逻辑就是模板算法中的一步,开发人员只需要关注业务实现,做到了高内聚,低耦合。

业务性代码:业务实现逻辑

NoSql:列存储,key-value的map数据结构形式,结构松散,一般聚合计算能力不强。

数据库:行存储,list的集合数据结构形式,查询需要循环遍历

Spring boot:约定优于配置,存在很多默认的配置,简化依赖配置

Java反射

什么是反射:反射就是把java类的各种成分拆分成一个个的java对象,像class对象、构造器对象、属性对象、方法对象。

可以拆分的java对象有:

  1. Class类:代表一个类
  2. Field类:代表类的成员变量(类的属性)
  3. Method类:代表类的方法
  4. Constructor类:代表类的构造方法

获取Class对象三种方式:

  1. Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。

Class stuClass = stu1.getClass();//获取Class对象

  1. Class stuClass2 = Student.class;
  2. Class stuClass3 = Class.forName("fanshe.Student");

Java中编译类型有两种:

  • 静态编译:在编译时就确定对象实例,像Student stu1 = new Student()。
  • 动态编译:运行时确定对象实例。通过类加载器加载class文件的时候确定对象实例。
动态代理

什么叫代理:通过代理对象来访问真实对象的方法。代理商代理厂家产品。

完成代理,需要两步骤:

  1. 建立代理对象与真实对象的代理关系,返回代理对象,代理对象类型是真实对象类型。
  2. 实现代理对象调用真实对象方法的代理逻辑:在调用真实方法前,或后,或异常情况下的一些处理

代理技术有两种

  1. JDK动态代理:InvocationHandler
  2. CGLIB动态代理:第三方包,MethodInterceptor

应用场景:

  1. 事务管理
  2. Controller通知,控制器通知
  3. Spring 缓存管理器
JDK动态代理

实现InvocationHandler,

  1. 建立代理对象与真实对象的代理关系,返回代理对象:代理对象可以访问真实对象接口下的所有方法,如果真实对象没有实现接口,不能被jdk代理。
  2. 实现代理逻辑
  3. public class JdkProxyTest implements InvocationHandler {

        private Object realObject;

       
       
    public Object getProxy(Object targetObject) {
            this.realObject = targetObject;
            return Proxy.newProxyInstance(
                        targetObject.getClass().getClassLoader(),
                        targetObject.getClass().getInterfaces(),
                        this   //当前对象实例作为代理对象
                    );
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //spring事务管理,执行SQL前先获取数据库连接
            System.out.println("在目标方法执行前执行的逻辑");
            Object value = null;
            try {
             //在执行目标函数之前,通过责任链模式,执行拦截器,当所有的拦截器都执行通过时,才能执行目标函数,

// 在handlerAdapter里,就是先执行拦截器,在执行控制器方法的,封装成了HandlerExecutionChain

            //执行业务逻辑

            value = method.invoke(realObject,args);

        } catch (Exception e) {

            e.printStackTrace();

            //当目标方法执行出现异常时,spring事务管理回滚事务.

            System.out.println("在目标方法执行出现异常时执行的逻辑");

        }

        //spring事务管理,在执行完目标方法时,释放数据库连接

        System.out.println("在目标方法执行后执行的逻辑");

        return value;

    }

}

CGLIB动态代理

第三方包,实现MethodInterceptor接口

  1. 建立代理对象与真实对象的对应关系:真实对象可以没有实现接口,代理对象类型是真实对象类型
  2. 实现代理逻辑:
  3. pubic class CgibProxyTest impements MethodInterceptor {         pubic Object getProxy(Cass clz) {         //增强类         Enhancer enhancer = new Enhancer();         //设置真实对象         enhancer.setSupercass(clz);         //设置当前实例对象为代理对象         enhancer.setCalback(this);         return  enhancer.create();     }     @Override     pubic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwabe {         //spring事务管理,执行SQL前先获取数据库连接         System.out.printn("在目标方法执行前执行的逻辑");         Object resut = nul;         try {
            //在执行目标函数之前,通过责任链模式,执行拦截器,当所有的拦截器都执行通过时,才能执行目标函数,

// 在handlerAdapter里,就是先执行拦截器,在执行控制器方法的,封装成了HandlerExecutionChain

            //执行业务逻辑

            result = methodProxy.invokeSuper(proxy,args);

        } catch (Exception e) {

            e.printStackTrace();

            //当目标方法执行出现异常时,spring事务管理回滚事务.

            System.out.println("在目标方法执行出现异常时执行的逻辑");

        }

        //spring事务管理,在执行完目标方法时,释放数据库连接

        System.out.println("在目标方法执行后执行的逻辑");

        return result;

    }

}
责任链模式

定义一个链条,链条上的每个环节都执行通过后才能去执行目标函数,像handlerAdapter,当所有的拦截器都执行通过后才能去执行控制器的函数(handler)。有的时候需要对拦截器的执行顺序排序,通过@Order注解。

场景:请假审批,项目经理审批、部门经理审批、人力部门审批。

观察者模式

又称为发布订阅模式,监听模式。原理:维护一个观察者列表,当有信息发布时,依次调用列表里的观察者通知接口。

场景:银行转账,微信、短信都会通知交易情况

工厂模式

工厂模式又分普通工厂模式和抽象工厂模式。原理:通过key-value的形式,根据Key找到具体的类,创建实例对象。只不过普通工厂模式是根据Key直接找到具体的类,抽象工厂模式是根据key,先找到具体的普通工厂,然后再根据Key,找到具体的类

策略模式

一个问题存在多种解决方案,具体使用哪种方案需要视情况而定。与工厂模式配合使用的比较多。

场景:将商场节日搞促销,像圣诞节要注销的商品、春节要促销的商品。

模板算法模式

将过程拆分成几个步骤,每一步的具体实现放到子类中去做。

场景:就是吃水果,将吃水果这个过程拆分成两个步骤:拿水果和吃水果。拿水果可能拿的是苹果,也可能拿的是橙子。吃水果可能是削削吃,也可能是榨汁喝。假如有个苹果子类,拿水果拿的是苹果,吃水果吃得是削的苹果。

AOP说是动态代理,面向切面编程,我更愿意把代理逻辑实现看成是一种模板算法,在目标方法执行前,执行后,或者执行异常该怎么做。

适配器模式

适配器模式就是把两个不相关的类关联起来。适配器模式又可以分为类适配器模式和对象适配器模式。

场景:假如进口了一台电视,这台电视电压要求是110V的,国内的电压都是220V的,这个时候需要一个变压器,这个变压器就是要说的适配器。这个变压器需要获取国内的电压将它变为110V,这个时候有两种解决方案:

第一种实现方式是将变压器类(适配器类)继承国内电压类,这样就能获取国内电压,然后进行一些 *** 作,把它变成110V,输出出去。这种方式就是类适配器模式,它使用到了继承。缺点是高耦合,灵活性低。优点是使用方便,代码简化;

第二种方式是变压器类,有国内电压类的引用,就是国电电压类作为变压器类的属性。这样就能通过国内电压类的实例对象获取到国内电压,然后进行 *** 作,将它变为110V,进行输出。这种方式就是对象适配器模式。

Spring mvc的handlerAdapter使用的就是对象适配器模式。

单例模式

建造者模式

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5694628.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存