最基本 几个设计模式思想
Posted kfkang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最基本 几个设计模式思想相关的知识,希望对你有一定的参考价值。
1
算法 排序 选择排序 冒泡排序 希尔排序
2
数据结构 数组 集合 队列 栈 先进后出 堆 (堆是一种经过排序的树形数据结构) 完全二叉树 平衡二叉树 红黑树
3
设计模式 工厂模式 单例模式 代理模式 策略模式 (我理解的只有这几个) 迭代器模式 (工作中没有具体使用 只有粗略的使用到)
-------------------------------------------------------------------------------------------------------------------------------------------
工厂模式:工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。
工厂模式可以降低代码重复 。
如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。
工厂模式可以减少错误,
因为工厂管理了对象的创建逻辑,
使用者不需要知道具体的创建过程,只管使用即可,
减少了使用者因为创建逻辑导致的错误。
$$总结:高复用(高可用) 低耦合 高效率
--------------------------------------------------------------------------------------------------------------------------------------------
单例模式:单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而达到使用目的
同时还能方便对实例个数的控制并节约系统资源(内存损耗)。如果希望在系统中某个类的对象只能存在一个 就需要用到单例
(典型的单例 比如 controller控制层 service层 dao层)目标接口类 去实现具体的操作
简单webproject -->【spring MVC前端控制器 走到 dispacherServelt 解析 model 生成 veiw 进行control 将前端 请求路径映射到控制层——》服务层-》持久层】
【持久层 查到结果 返回——》服务层——》控制层——》页面(前端)】
单例解析:
对单例类实例化后拿到的都是堆里面的同一个实例对象,通俗一点就是所有的这个单例的实例化引用都指向堆内存中的一个实例对象(有且仅有一个)
使用场景:对象需要频繁的实例化和销毁,此时考虑使用单例可以大大的提高性能
优点:1.由于只有一个实例对象,所以占用内存很少
2.对象不用重复new了,解放了对资源的重复占用,提升了性能
缺点:1.扩展性差了,想扩展每次都得改代码
2.使用的场景比较单调,如果是在多场景不断变化的实例对象最好不要使用单例,数据容易出问题
3.最好不要用到连接池那块,N多对象共享一个连接池,容易导致连接池溢出的
--------------------------------------------------------------------------------------------------------------------------------------------
代理模式:代理对象内部含有目标对象的引用 任何使用到 目标对象的地方 可以使用代理对象
代理模式作用:
动态代理: 其作用就是 高可用 高效率
当我们添加新代码时只需要
代理其目标类 生成新的类 进行修改添加
不使用时直接放弃不对原有的代码造成伤害影响。 高可用 低耦合 高效率 低内耗(少 new对象 降低内存的负担)
代理模式的使用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
(1)修改原有的方法来适应。显然这违反了“对扩展开放,对修改关闭”的原则。
(2)采用一个代理类调用原来的方法,且对产生的结果进行控制。这就是代理模式了。
使用代理模式可以将功能划分的更加清晰,有助于后期的维护 【高可用 高效率】
引用:
Spring本身含有两大特性,一个是IOC,一个是AOP的支持。
IOC的实现原理是利用了JAVA的反射技术,
控制反转IOC (正向的为 new一个对象 然后再调用 类的具体方法的变量)
依赖注入DI (例如A类需要B类资源 直接利用 注解 注入到A类中)
那么AOP的实现原理是什么呢?
动态代理-》动态代理技术主要分为Java自己提供的JDK动态代理技术和CGLIB技术。
Java自带的JDK动态代理技术是【需要接口】的,而CGLIB则是【直接修改字节码】。
--------------------------------------------------------------------------------------------------------------------------------------------
策略模式:
策略模式是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。
【例如 工具类 的具体方法使用】
容错恢复机制是应用程序开发中非常常见的功能。那么什么是容错恢复呢?
简单点说就是:程序运行的时候,正常情况下应该按照某种方式来做,
如果按照某种方式来做发生错误的话,系统并不会崩溃,也不会就此不能继续向下运行了,
而是有容忍出错的能力,不但能容忍程序运行出现错误,还提供出现错误后的备用方案,
也就是恢复机制,来代替正常执行的功能,使程序继续向下运行。
【例如 记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,然后 就先记录在文件里面,然后在合适的时候把文件中的记录再转录到数据库中】
策略模式优缺点
优点
1、避免了多重条件if...else if...else语句,多重条件语句并不容易维护
2、策略模式提供了管理相关算法簇的办法,恰当使用继承可以把公共代码移到父类,从而避免了代码重复
缺点
1、客户端必须知道所有的策略类,并自行决定使用 哪一个策略,这意味着客户端必须理解这些算法的区别,以便选择恰当的算法
2、如果备选策略很多,对象的数据会很多
--------------------------------------------------------------------------------------------------------------------------------------------
迭代器模式的优缺点:
简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,
但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。
而引入了迭代器方法后,用户用起来就简单的多了。
可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,
用户用起来【只需要得到我们实现好的迭代器】,就可以【方便的对集合进行遍历】了。
封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
总的来说: 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。
以上是关于最基本 几个设计模式思想的主要内容,如果未能解决你的问题,请参考以下文章