1 Star 0 Fork 0

Asynchronous / DesignPattern

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

DesignPattern

  1. 适配器模式:为了更好地应对复杂的且不断变化的场景,类似于一个中间件, 将一个不适合直接使用的接口通过适配器转化成可以使用的接口。 在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。

Adapter类接口:Target public interface AdvisorAdapter {

boolean supportsAdvice(Advice advice);

  MethodInterceptor getInterceptor(Advisor advisor);

} MethodBeforeAdviceAdapter类,Adapter class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {

  public boolean supportsAdvice(Advice advice) {
        return (advice instanceof MethodBeforeAdvice);
  }

  public MethodInterceptor getInterceptor(Advisor advisor) {
        MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
  return new MethodBeforeAdviceInterceptor(advice);
  }

}

  1. 委派模式:如Spring的DispatcherServlet.其实真的去执行方法的人并不是这个 DispatcherServlet, 而实他通过handle中预先加载了各个contriller中method对应的URL,保存在内存中,当有请求过来, 他拿到这个请求所对应的 URL,然后去比较,找到对应的就交给对应的Method去执行。

  2. 装饰器模式:它必须具有一个装饰的对象。它必须拥有与被装饰对象相同的接口。它可以给被装饰对象添加额外的功能。保持接口,增强性能。 例如:DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("FileTest.java"))); 首先想到在spring的applicationContext中配置所有的dataSource。这些dataSource可能是各种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL等,也可能是不同的数据源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根据客户的每次请求,将dataSource属性设置成不同的数据源,以到达切换数据源的目的。 spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。

  3. 观察者模式:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 该模式包含四个角色 抽象被观察者角色 抽象观察者角色 具体被观察者角色 具体观察者角色 比如行人、红绿灯 Spring中定义了ApplicationListener、ApplicationEvent就是典型的观察者模式

  4. 原型模式: 用于创建重复的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。 当直接创建对象的代价比较大时,则采用这种模式。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 实现克隆操作,继承 Cloneable,重写 clone()

  5. 代理模式:代理类和被代理类实现同一个接口,通过代理类来调用被代理类的业务。 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决. 为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

  6. 策略模式:封装变化的概念。编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。 举例:我们就以Java中的TreeSet为例,TreeSet仅仅知道它只是接收一个Comparator这种接口类型,但是具体是哪种实现类,TreeSet并不关心,实现类在真正的传入TreeSet之前,TreeSet本身是不知道的, 所以我们可以自己去实现Comparator接口,然后在实现类里面去封装好我们自己的规则(这里的规则你可以当做是算法),比如说我们要实现对一个集合的元素排序,但是到底是要升序排序还是降序排序,这个完全由我们来去控制, 我们可以把这种变化的内容封装到自己的实现类中,真正运行的时候才知道具体的实现。 SimpleInstantiationStrategy //使用初始化策略实例化Bean对象 @Override public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) { // Don't override the class with CGLIB if no overrides. //如果Bean定义中没有方法覆盖,则就不需要CGLIB父类类的方法 if (!bd.hasMethodOverrides()) { Constructor> constructorToUse; synchronized (bd.constructorArgumentLock) { //获取对象的构造方法或工厂方法 constructorToUse = (Constructor>) bd.resolvedConstructorOrFactoryMethod; //如果没有构造方法且没有工厂方法 if (constructorToUse == null) { //使用JDK的反射机制,判断要实例化的Bean是否是接口 final Class> clazz = bd.getBeanClass(); if (clazz.isInterface()) { throw new BeanInstantiationException(clazz, "Specified class is an interface"); } try { if (System.getSecurityManager() != null) { //这里是一个匿名内置类,使用反射机制获取Bean的构造方法 constructorToUse = AccessController.doPrivileged( (PrivilegedExceptionAction>) () -> clazz.getDeclaredConstructor()); } else { constructorToUse = clazz.getDeclaredConstructor(); } bd.resolvedConstructorOrFactoryMethod = constructorToUse; } catch (Throwable ex) { throw new BeanInstantiationException(clazz, "No default constructor found", ex); } } } //使用BeanUtils实例化,通过反射机制调用”构造方法.newInstance(arg)”来进行实例化 return BeanUtils.instantiateClass(constructorToUse); } else { // Must generate CGLIB subclass. //使用CGLIB来实例化对象 return instantiateWithMethodInjection(bd, beanName, owner); } }

  7. 模板模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 DispatcherServlet中的 protected void initStrategies(ApplicationContext context) { this.initMultipartResolver(context); this.initLocaleResolver(context); this.initThemeResolver(context); this.initHandlerMappings(context); this.initHandlerAdapters(context); this.initHandlerExceptionResolvers(context); this.initRequestToViewNameTranslator(context); this.initViewResolvers(context); this.initFlashMapManager(context); }

  8. 工厂模式: 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。

Hello! 这是singletonBean!value> bean>
<bean id="itxxzBean" class="com.itxxz.HelloItxxz"
    singleton="false">
    <constructor-arg>
        <value>Hello! 这是itxxzBean! value>
    </constructor-arg>
</bean>
  1. 单例模式: 在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定

空文件

简介

取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/zyc7798544/DesignPattern.git
git@gitee.com:zyc7798544/DesignPattern.git
zyc7798544
DesignPattern
DesignPattern
master

搜索帮助