设计模式

作者: go_2021 | 来源:发表于2021-12-12 18:37 被阅读0次
    创建型
    1. 工厂
      作用:解耦代码
      代码的解耦 一个对象我要实现单例 简单的是在这个类 中把构造方法 设置为private 然后在这个类里面 添加一个属性和方法 来返回本类的唯一实例 这就需要在类本身做修改 如果类不能修改 实现单例多例 在加一层工厂类 实例化类的时候 调用不同的工厂类 来创造 单例工厂
      多例工厂 实现了创建类和类本身的解耦.
      简单工厂: 又叫做静态工厂方法(StaticFactory Method)模式 由一个类充当 调用其静态方法 实现对象的创建.

    spring中
    beanFactory 简单工厂
    继承 FactoryBean 是工厂 根据具体是实现类 来初始化类实例

    1. 抽象工厂
      作用:解耦代码
      是围绕一个超级工厂创建其他工厂 工厂上又添加了一层抽象 好比装备 武器 每个等级 对应不同的 装备 武器 装备是个工厂 武器是一个工厂 之上还有个超级工厂 来批量的控制这些工厂

    2. 单例

    3. 建造者
      作用:简化代码 builder().a("a").build()
      jdk中 StringBuilder
      一般定义 bean的时候 可以用 lombok来简化代码 setter getter builder data

    4. 原型
      作用:简化复制类 如果类比较大 复制每个属性都要set那是很繁琐的
      一般我们要完成 类的拷贝
      首先类 要实现 cloneable 接口 重写clone方法 return super.clone();
      在 A a = new A();
      b = a.clone();
      此时b是新创建的一个新的对象 其基本类型 和a保持一致 但引用的对象 是一样的
      这就是 浅拷贝
      实现深拷贝 一般两种方法
      1 序列化 反序列化
      2 重写clone方法 比方说 a类中有 aa子类 aa子类也实现 cloneable 接口 重写clone方法
      重写a clone方法 this.aa = this.aa.clone();

    结构型

    带翔 室外 桥组装

    1. 代理
      作用:简化资源的占用 一个类只有一个实例
      动态代理 aop 静态代理可以自己写java代码
      spring中
      JdkDynamicAopProxy和Cglib2AopProxy
      为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

    2. 享元
      作用:主要用于减少创建对象的数量,以减少内存占用和提高性能。
      java.lang.Integer(其它基本类型包装类(除去Float,Double)也如此,还有BigDecimal)
      Integer.valueOf()方法
      byte,short,int,long,boolean,char的包装型在类加载到JVM时,已经缓存了制定范围的对象引用,因为值的设定使用的是static块或者常量。
      其中char的范围为:0~127;
      boolean的值为true和false;
      其它默认范围都是-127~128。
      其中int的上限127可以调整,这需要调整JVM的参数。
      同时利用了享元模式的还有String这个类,因为生存的每个字符串都是不可变的。

    3. 适配器
      作用:兼容不同的接口
      比方说电脑上 电脑只支持typec的接口
      u盘的接口 显示器的接口 都不能兼容
      添加一个兼容器 电脑调用兼容器的接口 由兼容器来兼容 u盘接口 和显示器接口
      spring中
      Spring实现这一AOP功能有很多种控制器(Controller)
      一种是带@Controller注解的,
      还可以写一个servlet 当做controller,
      所以用适配器做适配,你看看HandlerAdapter有几个子类,每个子类都是适配某一种类型的控制器,有了HandlerAdapter,你只需要调用handle方法
      HandlerAdatper根据Handler规则执行不同的Handler

    4. 外观
      作用:隐藏复杂性 对外提供简单接口

    • tomcat 的RequestFacade类 ResponseFacade类
      https://www.zhihu.com/question/39872707
      request类实现了 sevlet的相关方法 但是也实现catalina的一些方法
      requestFacade包了一层 request类 对应用层暴露了简单的sevlet标准的方法 接口隔离原则
    1. 桥接
      作用:抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化
      比方说 形状
      shape 圆 方
      颜色 绿色 红色
      我可以在圆的类 下创建 红圆 绿圆 子类
      创建的时候 我就直接 new 红圆() 就可以了 但是继承 的关系不够灵活 耦合太高
      用桥接的模式 创建 一个color接口 红 绿 去实现这个类
      在shape构造方法中 把颜色的实例传过来 new 圆(new red())
      形状 和颜色 两个接口 独立开来 互不影响
    2. 组合
      作用: 把类当做树级关系进行管理 比方类中 add方法 是在类中 创建一个 自己类的实例 实现层级关系
    3. 装饰
      作用:不修改原来的代码 扩展类 中增强功能
      spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。
      HttpServletRequest 的实现类 是在tomcat 或者 jetty容器里
      然后HttpServletRequestWrap是对功能的 装饰类 需要增强方法 继承实现即可
    行为型

    北侧叠则放名模 关节中装

    1. 备忘录
    2. 策略
      理解对代理的区别 都是可以进行选择 不同是代理和实现类的 结构 一般是一样的
      而策略 只是对一组算法实现的 封装 比较抽象
      定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
      IoC容器根据bean定义的内容实例化相应bean对象的时候,会根据情况决定使用反射还是使用cglib来实例化相应的对象
    3. 迭代
    4. 责任链
    5. 访问者
    6. 命令
    7. 模板方法
    8. 观察者
      spring中事件驱动 一个listener 是一个接受者
      继承BaseEvent 定义一个事件
      调用 applicationContext.publishEvent 发布事件
      定义观察者 implements ApplicationListener<事件class> 实现onApplicationEvent方法
      可以定义多个 观察者 来监听事件 之后做对应的事情
      定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
      spring中如ApplicationListener。
      通过对 applicationListener的实现 可以监控 spring的事件 比方说 当所有bean初始化之后 用户处理servlet请求后等.
    9. 解释器
    10. 中介
    11. 状态
      允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

    参考:https://blog.csdn.net/caoxiaohong1005/article/details/79961539

    相关文章

      网友评论

        本文标题:设计模式

        本文链接:https://www.haomeiwen.com/subject/emorfrtx.html