zoukankan      html  css  js  c++  java
  • spring中设计模式

    MVC模式
    Model:pojo、数据库交互(业务数据和业务逻辑) View:Jsp(与用户交互页面) Controller:控制器(接收请求并决定调用哪个模块组件去处理请求,然后决定调用哪个视图(通过转发或重定向)来显示返回的数据)
    单例模式
    [**点击查看各种单例模式实现方法**](https://blog.csdn.net/csdn_conda/article/details/80285280) 利用双重检查锁定(Double-Checked Locking)来降低同步的开销 ``` public class Singleton {
    private static volatile Singleton sInstance = null;
    private Singleton () {
    

    }
    public static Singleton getInstance () {
    if (sInstance == null) {
    Synchronized(Singleton.class){
    if (sInstance == null) {
    sInstance = new Singleton();
    }
    }
    }
    return sInstance;
    }
    }

    
    **为什么需要用<span style="color:red;">volatile</span>修饰变量sInstance ?**
    因为sInstance = new Singleton();这行代码实际上做了以下工作:
    

    memory = allocate();  // 1:分配对象的内存空间
    ctorInstance(memory); // 2:初始化对象
    instance = memory;  // 3:设置instance指向刚分配的内存地址

    1、2、3指令可能会重排序为1、3、2,将导致外层判断出instance不为空,该线程接下来将访问instance引用的对象,而此对象事实上是一个还未初始化的对象。故需要加修饰,可以确保外层null检查要么看到的是null,要么看到的是一个构造完整的对象。
    volatile可以保证有序性和可见性(即读操作在写操作之前)。
    <table><tr><td bgcolor=#B0C4DE>工厂模式</td></tr></table>
    [**点击查看三种工厂模式详解**](https://www.cnblogs.com/zailushang1996/p/8601808.html)
    <span style="color:red;"> 简单工厂:</span>是一个具体的类,有一个重要的create()方法,根据入参判断new哪个实例,不符合开闭原则,扩展性差,新增需要修改工厂类方法。create()方法通常是静态的,所以也称之为静态工厂。
    <span style="color:red;"> 工厂方法:</span>提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。利用多态性
    <span style="color:red;"> 抽象工厂:</span>是可以生产多个产品的,而工厂方法模式则只能生产一个产品。
    
    
    <table><tr><td bgcolor=#B0C4DE>适配器模式</td></tr></table>
    [***点击查看适配器模式详解***](https://www.cnblogs.com/V1haoge/p/6479118.html)
    将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作,类似生活中转接头的概念。
    <span style="color:red;"> 类适配器模式:</span>通过继承来实现适配器功能。只能访问A接口,但想要调用B中的方法b,可以写适配器类P实现A接口,并继承B接口的实现类,这样就可以调用P中的方法b。
    <span style="color:red;"> 对象适配器模式:</span>与上述类似,但只需实现A接口,并创建一个B的实现类的实例为成员变量bInstance,即可在a()中调用bInstance.b()。
    <span style="color:red;"> 接口适配器模式:</span>已有一个包含很多方法的接口,创建一个实现该接口的实现类P,以置空的方式实现所有方法,我们需要哪些方法就直接继承P并重写对应的方法,而不需要重写所有的方法。
    
    - 使用场景
        - 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
        - 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作
    
    <span style="color:#00FF7F;"> 优点:</span>将目标类和适配者类解耦,灵活性和扩展性都非常好,完全复合开闭原则。
    <span style="color:#00FF7F;"> 缺点:</span>一次最多只能适配一个适配者类,不能同时适配多个适配者。
    
    
    [**点击查看别人总结spring中各种模式**](https://blog.csdn.net/caoxiaohong1005/article/details/80039656)
    ##工厂方法
    方式:实现FactoryBean接口。
    原理: 
    实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。
    

    public SqlSessionFactory getObject() throws Exception {
    if (this.sqlSessionFactory == null) {
    afterPropertiesSet();
    }
    return this.sqlSessionFactory;
    //返回的不是 SqlSessionFactoryBean 的实例,而是 SqlSessionFactoryBean.getObject() 的返回值
    }

    [SqlSessionFactoryBean解析](https://www.cnblogs.com/wade-luffy/p/6093355.html)
    
    ##适配器模式
    方式:SpringMVC中的适配器HandlerAdatper。
    原理:HandlerAdatper根据Handler规则执行不同的Handler。
    过程: 
    DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
    实现意义: 
    HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。
    - 不同类型的Handle
        - 继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter 
        - HTTP请求处理器适配器:HttpRequestHandlerAdapter 
        - 注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter
     
    [springmvc适配器模式](https://blog.csdn.net/a362212624/article/details/80431499)
  • 相关阅读:
    codefoces 1405 D Tree Tag
    洛谷P3413 萌数
    数位DP模板
    leetcode 统计所有可行路径
    Josephus Transform 加速置换
    牛客IOI周赛18-提高组 排列
    Find a way HDU
    Oil Deposits HDU
    Fire! UVA
    Pots POJ
  • 原文地址:https://www.cnblogs.com/xiaobingzi/p/10684595.html
Copyright © 2011-2022 走看看