精华内容
下载资源
问答
  • 异常和错误 基本的概念:都是一些具体的类和类中的...每一个异常类 都是Exception的子类 它封装了一种错误信息。 常见的运行时异常 ArithmeticException 被除数不能为0的异常 NullPointerException 空指针异常 Array...

    异常和错误

    基本的概念:都是一些具体的类和类中的方法
    异常类的超类 Throwable
    异常类 Exception 继承 Throwable
    错误类 Error 继承Throwable

    每一个异常类 都是Exception的子类 它封装了一种错误信息。

    常见的运行时异常

    ArithmeticException 被除数不能为0的异常
    NullPointerException 空指针异常
    ArrayIndexOutOfBoundsException 数组下标越界异常
    ClassCastException 类型转换异常
    ArrayStoreException 尝试将一个不同的数据类型存放到数组中
    IndexOutOfBoundsException 尝试从容器中获取一个没有的数据
    DateTimeException LocalDateTime会抛出这个异常
    NegativeArraySizeException 创建一个负数的数组
    NumberFormatException 尝试将一个错误的字符串格式转换为数字 必须为数字格式的字符串
    IllegalArgumentException 代码格式参数传递错误

    编译型异常

    ClassNotFoundException 少个类 或者缺少jar包

    异常的特点:
    1.异常类 封装了一些错误信息,根据错误信息,以及代码错误行数去修改代码 从而避免发生这样的异常
    2.一旦碰到异常 它下面的代码就停止了…
    3.编译的异常一定要try…catch 一般来说我们的使用方式 都是打印错误信息
    3.IO流 和 网络编程 一定要在catch中关闭资源
    inputstream.close();
    outputstream.close();
    reader.close();
    writer.close();
    自定义异常
    自定义编译异常 extends Exception
    自定义运行时异常 extends RuntimeException

    1.什么叫做异常?

    异常就是我们程序在运行过程中可能会发生的错误,这个错误就叫做异常。
    异常类和异常对象本身没有实际的用途,一般它封装了错误的信息。
    异常的目的是为了让我们知道是个什么错误。哪一行报错。
    异常的种类
    编译型异常 都是需要try…catch
    如果你不给他try…catch或者throws 它编译都不会通过
    由你自己来定义程序出错之后的解决方案
    当碰到错误之后 代码还要执行 可以用try…catch 并且将要执行的代码放到catch中
    运行时异常 RuntimeException的子类都不需要强制的try…catch
    运行时异常在代码运行过程中才能检查出错误信息
    运行时异常 系统默认的就已经给了你一种的处理方式 打印错误信息
    2.什么叫做错误?

    Error Throwable的子类 普通的类 封装了错误的信息。
    当我们碰到错误之后,根据错误的信息找到相应的类 查看他的错误或者异常的含义,从而分析代码,解决代码的问题
    StackOverflowError 栈溢出的错误

    3.异常和错误的区别?

    异常是可以通过修改代码避免 修改代码后 逻辑还在 异常是可以避免的
    错误是是无法避免的 代码中存在错误 只能删除代码 逻辑就更变了

    4.什么用到异常?

    一、一旦遇到检查型异常代码 一定要及时使用try…catch处理,不要继续往后面抛
    二 、如果当前的代码存在多个异常 不要使用Exception来捕获异常 要区别处理
    三、使用io流或者网络编程 这种占用系统内存极高的类 一定使用finally关闭资源
    四、 检查型代码中也可以有return语句 return 语句必须在try{}catch中都要有
    return 语句在finally可以有可以没有 如果有 返回值结果一定是他
    在finally块后也可以有return 但是会和finally起冲突 两者只能选其一

    5.为什么有的时候需要使用异常,为什么有的时候不需要?

    1.写代码都是不安全的代码
    2.代码中是运行时异常 Jvm会帮助我们打印错误信息,我们就不需要使用异常
    如果代码是检查型异常 说明当前的代码我们一定要按照异常的处理方式去处理
    处理最基本的方式就是打印错误信息

    展开全文
  • 每个人都应该懂点逻辑学,特别是在网络时代,更多的...这篇文章主要摘录《简单的逻辑学》一书里的第五章,弥缝选出了最常见的20种逻辑思维错误(非逻辑思维形式,Informal Fallacies)。通过阅读本文,我相信你可以把
     
    

    每个人都应该懂点逻辑学,特别是在网络时代,更多的信息和评论发表,我们要通过自己的逻辑思考来辨别里面的真伪。

    这篇文章主要摘录《简单的逻辑学》一书里的第五章,弥缝选出了最常见的20种逻辑思维错误(非逻辑思维形式,Informal Fallacies)。通过阅读本文,我相信你可以把这些理论与很多网络上“五毛”的非理性评论,一些事件中产生的错误逻辑观点或现实生活中遇到的事件对上号(弥缝也在一些思维模式的最后添加了实例,希望能够有所帮助)。

    首先,我们看这几种网络上流行的“五毛党”惯用的伎俩:

    对人不对事

    在论证中,我们要关注的是论证本身,而不是做出论证的人。如果一个人忽略论证本身而故意去攻击论证者,那么他们就违反了这个原则。所谓的对人不对事,就是在他人辩论时,通过向公众传达关于对手的与论证无关的信息,例如生活中的负面信息,以此来达到击败对手的目的。这种谬误制造者的目的是转移听众对论证的注意力,这种情形通常是由于论证者本人处于劣势。

    如果论证的目的仅仅是获胜,对人不对事谬误将会有效地发挥作用。它可以使听众以同论证毫不相关的理由来反对你的对手,而你则可以用同样的理由来取悦听众。它造成的后果是,你可以庆祝你战胜了对手,但恰恰是你所没有做到的的——至少在逻辑上。你的胜利并非源于观点的价值,而是源于你扰乱听众视听的能力。

    以出身论英雄

    现在假设你是一个声誉斐然的公司的从事经验。作为工作的一部分,你对全国著名的大学和学院知之甚多,并且对毕业生的基本情况了如指掌。尤其,你知道X学院在这个领域内声名狼藉。目前,你的公司正在招聘一个重要的职位。在浏览候选人资料时,你扫到一个X学院的毕业生,彼得,于是你立刻决定拒绝他们进入下一轮,仅仅是因为他们所毕业的学校。这个时刻,你已经产生了谬误。

    不是说你的决定完全不合理。毕竟,以你对X学院的了解,彼得或许确实不是一名合格的人选。但是,这不是必然的。一颗闪亮的新星是可能出于类似X学院之类的学校的。你所犯的谬误的根源如下:知道一个来源一般是坏的,于是认定出于这个来源的所有都一定是坏的。这并不必然成立。

    考虑我们所考察的人或事的出身肯定是必要的。但是我们必须走得更远。首先我们要问:彼得从哪里来?紧接着,更关键的问题是:他的品质如何?

    【弥缝注】这两种逻辑错误主要在于辩论方向不在论题上而是参与论证的人上。《三国演义》中诸葛亮舌战群雄中吴国儒士的问话:“曹操虽挟天子以令诸侯,犹是相国曹参之后。刘豫州虽云中山靖王苗裔,却无可稽考,眼见只是织席贩屦之夫耳,何足与曹操抗衡哉!”和“孔明所言,皆强词夺理,均非正论,不必再言。且请问孔明治何经典?”其中都是对刘备和诸葛亮进行人身攻击——一个织席的和一个没写过经典著作的两个人如何能登大雅之堂,论国家大事。另外一些例子,如“他父亲是个罪犯,所以他的儿子也不是一个好人”等。

    稻草人谬误

    论证中,我们要对事不对人,要紧扣论证中给定的论点。在与他人辩论的过程中,如果你为了消弱对方的论点而故意扭曲其论证过程,那就犯了稻草人谬误。在这个比喻中,“稻草人”意味着容易对付的事物。在我们误解某个论证时,或是当一些论证非常复杂,我们在理解上犯了一些无意的错误时,我们犯的并不是这种谬误。稻草人谬误不是无心之过,因为它是在有意地歪曲别人的论点

    【弥缝注】常见的稻草人谬误,如对论点进行断章取义和偷换概念。比如说这篇新华网文章(随机搜索到的),倒数第二段中提到“美国还是世界上最主要的过滤软件生产国,世界各国封堵信息使用的过滤软件大多数都是美国公司生产的”和前面那一句是对“网络自由”论点的偷换概念。

    接着看一些看起来容易识别的,现实中却容易犯的逻辑形式错误:

    否定前项

    在讨论条件论证时(形式A->B),我们知道有两种有效的式:肯定前项和否定前项。

    与此相对应,无效形式也有两种:第一种就是否定前项。这种论证的形式如下:

    如果A,那么B

    不是A

    所以不是B

    举例如下:

    如果路易斯在跑步,那么他们在移动。

    路易斯没有跑步。

    所以,他们没有移动。

    分析:我们可以很明显地看出,路易斯没有跑步不是他们没有移动的充分条件。大前提告诉我们的是,如果A实现,则B必然实现(路易斯没有移动则必然没有跑步)。但是这不意味着A是可以导致B的惟一条件(路易斯在移动可以是因为他们在走路,或者在睡梦中翻身,或者是在跳舞机上跳舞)。就是这样,仅仅是A的缺席并不能得出B一定缺席的结论。记住,这是一个无效论证,因为结论并不具备必然性。那么结论可能是正确吗?可能,但是不能确定。

    肯定后项

    条件论证的另一种无效形式称为肯定后项。形式如下:

    如果A,那么B

    B

    所以,A

    举例如下:

    如果路易斯在跑步,那么他们在移动。

    路易斯在移动

    所以,他们在跑步。

    分析:首先我们可以看出结论不成立。为什么不成立?让我们回头来看大前提。它告诉我们,为了某个随之而来的特定结论(路易斯移动),某个特定的条件(路易斯跑步)必须要满足。依据原来所讲过的论证,这个命题并不是说惟有这个条件成立,才能得到所要的结论。因此,如果结论已经成立(路易斯移动),我们不能得出特定条件(路易斯跑步)就是惟一解释的结论。除了跑步,还有其它许多途径可以使路易斯移动。于是,在这种情况下得出的结论可能是正确的,但不是必然正确的。

    中项不周延

    在讨论三段论时,我们知道中项(出现在前提中但不出现在结论中)必须至少有一次是全称的(周延的),因为它要有适当的范围来联结大前提和小前提。如若不然,应付产生中项不周延谬误。通俗一些,可以称之为牵连犯罪。针对后一点,我们来看而下面的例子:

    几个纳粹党人是凯撒俱乐部的成员。

    汉斯是凯撒俱乐部的成员。

    所以,汉斯是纳粹党人。

    分析:这是个错误推理,并不能因为汉斯是俱乐部的成员,而俱乐部里有几个纳粹党人,就能得出汉斯也是纳粹党人的结论。这种情况下,汉斯是有嫌疑的,但这并不是说我们就可以把自己的猜测作为真相来宣布。

    循环论证

    有时也称为恶性循环。这一谬误的要点如下:首先,命题A被作为另一个命题B的前提条件;然后,过程被反过来,最初的前提A现在变为结论,而最初的结论B则变为前提。我们来看下面的论证:

    因为人的命运是注定的,

    他们缺乏自由的愿望。

    然后,几页之后,我们又读到:

    根据人类缺乏自由愿望的事实,

    所以他们的行为是被注定的。

    如果这两个论证前后相连地放在一起,它们的循环性就会很容易被看出来。所以夹在它们中间的很多内容是故意放进去的,以便将其岔开很远,以期读者在读到第二个论证的时候,已经忘记了第一个论证的内容。

    【弥缝注】循环论证,更容易理解的方式是:先有鸡还是先有蛋。另外一个常引用的例子则是《圣经》与上帝。

    问:《圣经》是否是可信的?

    答:是。因为那是上帝的语言被人记录下来的。

    问:上帝是否存在?

    答:《圣经》中说上帝是存在的,所以上帝是存在的。

    在参与辩证时,我们还容易受到自身对事物理解的影响,比如以下三种:

    情感误导

    当我们选择性地忽略一些与我们的信仰相抵触的重要信息时,我们就犯了情感误导谬误。导致的结果就是对所讨论问题的严重扭曲。

    假设我在写一部关于我的母校X大学的历史的书籍。我热爱我的母校,将在校园的日子视为我一生中最美好的时光。我想在我的书中向人们证明我的母校是全国最好的大学之一。但是,研究得越深入,我越发现母校过去的历史并不是那么令人满意。可是我不改初衷,所以我在写作的时候,决定剔除所有母校历史上的负面新闻,只反映它光辉的一面。于是,我就犯了情感误导谬误,我在书中所描绘的X大学的面目已经被严重扭曲了。

    功利误导

    效果不能单独确定一个行为的价值。当我们仅仅注重于一个方法对想要得到结果的作用而不考虑其他方面时,我们就犯了功利误导谬误。仅仅看到目标是不够的,但那经常是我们所关注的全部。问题是:我们是如何达到目标的?

    当我们利欲熏心,为达目的不择手段时,就犯了功利误导谬误。操纵这种谬误的态度是:只要我成功了,如何取得成功并不重要。

    【弥缝注】在唐骏学历门上的网友辩论上,就常常出现这样的功利误导。

    简化主义

    如前所述,一个整体大于其组成部分的总和。例如,人的身体可以根据化学元素被分解,但是如果声称人的身体等同于一堆化学元素,那将是对最简单的推理的盲从,是向简化主义谬误屈服。

    这种谬误发生于当我们选择性地只对整体的一部分加以关注时。例如,当我们只把精神放在一个人的缺点上,并因此认为我们已经完全了解了这个人的本质时,这个谬误就正在发生作用。

    在一下篇文章中弥缝将介绍另外十种容易出现的逻辑思维错误。


    原文链接:http://www.mifengtd.cn/articles/informal-fallacies-1.html

    展开全文
  • 根据《五分钟逻辑学》视频整理。 文字地址:http://logicalminute.blog.sohu.com 视频地址:http://www.dxzy163.com/view/index7168.html 1.为什么学逻辑学 让我们的思考变得更加严谨,合理。 能够更加有力...

    根据《十五分钟逻辑学》视频整理。

    文字地址:http://logicalminute.blog.sohu.com

    视频地址:http://www.dxzy163.com/view/index7168.html

     

    1.为什么学逻辑学

    让我们的思考变得更加严谨,合理。
    能够更加有力地捍卫自己的权利。【典型的儒家道德式和逻辑式是相对立的,所有一切都是需要论证的,以外在客观条件为基础。以儒家道德式看待问题很容易造成冲突。】
    学懂自然科学,学习社会科学,甚至了解现代社会,需要逻辑学作为基础。(打开世界的钥匙、真正懂科学、理性看待社会)


    图   爱因斯坦眼中的逻辑学


    2.什么是逻辑学

        2.1 什么是逻辑

    4种常见的含义:
    ①客观事物的规律
    ②某种特殊的理论、观点或看问题的方法
    ③思维的规律、规则
    ④逻辑学这门科学
    ③和④是逻辑学中会谈到的“逻辑”。

    逻辑:思维的规律。【逻辑,感性,情感等功能都会在把握事物中起作用。逻辑在把握事物上是最为强大的。】
    因为……所以……
    只要……就……
    如果……那么……
    只有……才……

    对上面内容的归纳:

    1)要充分利用初等数学中的充分条件,必要条件等知识。
    2)逻辑是指思维的形式,而非内容。

     

    2.2 什么是逻辑学

    研究思维的规律的科学。


    形式 = 结构 || 形式 ≠ 内容
    要攻击一个论题,首先要搞清楚它的形式,攻击其前提条件。

    2.2.1 语言与逻辑的关系

    · 思考就是人默默同自己说话。离开了语言,思维是不能进行的。思维形式中的概念由词语表达,判断、推理由语句表达。
    · 语言具有民族性,但逻辑是全人类共同具有的。
    · 先理清语法错误,然后理清逻辑错误。

    2.2.2 逻辑等价叫法

    逻辑 = 思维的规律 = 思维顾虑
          = 思维的形式 = 思维形式
          = 思维的规则 = 思维规则
          = 思维的结构 = 思维结构
          = 思维的形式结构

    2.2.3 什么是思维

    思维是人的理性认识。通俗地讲,思维就是通常所说的“想一想”,“”考虑考虑。

    2.2.4 什么是思维的规律

    人的大脑对事物的认识活动,是借助于概念、判断和推理等思维的形式来进行的,思维的过程就是运用概念做判断和推理的过程。
    思维的三种类型:概念、判断、推理。

    逻辑
    感性认识
    情感体验

    不能因为逻辑的强大就贬低感性认识和情感体验。

    感性认识理性认识情感认知
    感知觉、表象概念、判断、推理喜、怒、哀、乐
    感知觉、表象,是心理学研究的内容概念、判断、推理,是逻辑学研究的内容情感认知是心理学研究的内容

    图 感性认识和理性认识、情感认知的比较

    感性认识、情感认知是心理学研究的对象。理性认识要以前两者为基础,是一种高级阶段。

    2.2.5 逻辑学分类

    图 逻辑学分类


    3.怎么学逻辑学

    3.1用逻辑去怀疑一切,逐步养成用逻辑去思考的自觉意识。

    3.2始终记住,逻辑追求的是确定性。(从确定的前提到确定的结论)

     

    图  什么是逻辑的确定性

    我们在看一本书的时候也要用作者观的前提推论他的观点是否正确。
    需要说明的是,我们在使用逻辑学的时候只是关注形式,从确定的大前提看能否推导出确定的结论。关于大前提是否正确,那是学科需要关注的东西,与逻辑学没有关系。

    转载于:https://www.cnblogs.com/helloIT/articles/4990455.html

    展开全文
  • 十种常用的设计模式

    千次阅读 2018-05-28 17:10:05
    多重条件语句不易维护,它把采取哪一算法或采取哪一行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。 策略模式的缺点  (1)客户端必须知道所有的...

    转自:dean_hu

    设计模式总结

    1.       单例模式

    实现方式:

    a) 将被实现的类的构造方法设计成private的。

    b) 添加此类引用的静态成员变量,并为其实例化。

    c)  在被实现的类中提供公共的CreateInstance函数,返回实例化的此类,就是b中的静态成员变量。

     

    应用场景:

    优点: 
        1.在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例 
        2.单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。 
        3.提供了对唯一实例的受控访问。 
        4.由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。 
        5.允许可变数目的实例。 
        6.避免对共享资源的多重占用。 
    缺点: 
        1.不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。 
        2.由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。 
        3.单例类的职责过重,在一定程度上违背了“单一职责原则”。 
        4.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。 
    使用注意事项: 
        1.使用时不能用反射模式创建单例,否则会实例化一个新的对象 
        2.使用懒单例模式时注意线程安全问题 
        3.单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承(如登记式模式) 
    适用场景: 
        单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如: 
        1.需要频繁实例化然后销毁的对象。 
        2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 
        3.有状态的工具类对象。 
        4.频繁访问数据库或文件的对象。 
    以下都是单例模式的经典使用场景: 
        1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 
        2.控制资源的情况下,方便资源之间的互相通信。如线程池等。 
    应用场景举例: 
        1.外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件 
        2. Windows的TaskManager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 
        3. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。 
        4. 网站的计数器,一般也是采用单例模式实现,否则难以同步。 
        5. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。 
        6. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。 
        7. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。 
        8. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。 
        9. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。 
        10. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例. 

     

    2.       策略模式

    实现方式:

    a)      提供公共接口或抽象类,定义需要使用的策略方法。(策略抽象类)

    b)      多个实现的策略抽象类的实现类。(策略实现类)

    c)       环境类,对多个实现类的封装,提供接口类型的成员量,可以在客户端中切换。

    d)      客户端 调用环境类 进行不同策略的切换。

    注:Jdk中的TreeSet TreeMap的排序功能就是使用了策略模式。


    策略模式的优点

      (1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。

      (2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。

    策略模式的缺点

      (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

      (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

     

    3.       代理模式
    一)静态代理

    实现方式:

    a) 为真实类和代理类提供的公共接口或抽象类。(租房)

    b) 真实类,具体实现逻辑,实现或继承a。(房主向外租房)

    c)  代理类,实现或继承a,有对b的引用,调用真实类的具体实现。(中介)

    d) 客户端,调用代理类实现对真实类的调用。(租客租房)

    二)动态代理

    实现方式:

    a) 公共的接口(必须是接口,因为Proxy类的newproxyinstance方法的第二参数必须是个接口类型的Class)

    b) 多个真实类,具体实现的业务逻辑。

    c)  代理类,实现InvocationHandler接口,提供Object成员变量,和Set方法,便于客户端切换。

    d) 客户端,获得代理类的实例,为object实例赋值,调用Proxy.newproxyinstance方法在程序运行时生成继承公共接口的实例,调用相应方法,此时方法的执行由代理类实现的Invoke方法接管。


    jdk动态代理使用的局限性
    通过反射类ProxyInvocationHandler回调接口实现的jdk动态代理,要求委托类必须实现一个接口,但事实上并不是所有类都有接口,对于没有实现接口的类,便无法使用该方方式实现动态代理。

     

    4.       观察者模式

    观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    实现方式:

    a) 角色抽象类(提供对观察者的添加,删除和通知功能)。

    b) 角色具体类,实现a,维护一个c的集合(对角色抽象类的实现)。

    c)  观察者抽象类(被角色通知后实现的方法)。

    d) 观察者实现类,实现c(多个)。

    注:JDK提供了对观察者模式的支持,使用Observable类和Observer接口


    两种模型(推模型和拉模型):

    ■  推模型是假定主题对象知道观察者需要的数据;而拉模型是主题对象不知道观察者具体需要什么数据,没有办法的情况下,干脆把自身传递给观察者,让观察者自己去按需要取值。

    ■  推模型可能会使得观察者对象难以复用,因为观察者的update()方法是按需要定义的参数,可能无法兼顾没有考虑到的使用情况。这就意味着出现新情况的时候,就可能提供新的update()方法,或者是干脆重新实现观察者;而拉模型就不会造成这样的情况,因为拉模型下,update()方法的参数是主题对象本身,这基本上是主题对象能传递的最大数据集合了,基本上可以适应各种情况的需要。

      

     

    5.       装饰模式:

    实现方式:

    a)       抽象的被装饰角色 (所有的角色都要直接或间接的实现本角色)

    b)       具体的被装饰角色,实现或继承a (被功能扩展的角色)

    c)       装饰角色,实现或继承a (本类有对a的引用,所有的具体装饰角色都需要继承这个角色)

    d)       多个具体修饰角色 ,继承c(对被装饰角色的功能扩展,可以任意搭配使用)


    意图: 

    动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。

    适用环境:

    (1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

    (2)处理那些可以撤消的职责。

    (3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

      

    6.      适配器模式:

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

    1.       类适配器(子类继承方式)

    实现方式:

    a)     目标抽象角色(定义客户要用的接口)

    b)     适配器(实现a继承c,作为一个转换器被客户调用)

    c)     待适配器(真正需要被调用的)

    d)     客户端(借用a的实例调用c的方法)


    2.     对象适配器(对象的组合方式)

    实现方式:

    a)     目标抽象角色(定义客户要用的接口)

    b)     适配器(实现a,维护一个c的引用,作为一个转换器被d调用)

    c)     待适配器(真正需要被调用的)

    d)     客户端(此类,借用a类的实例调用c类的方法,类似静态代理,但是解决的问题不同)


    3.     缺省的方式

    实现方式:

    a)     抽象接口

    b)     实现a的适配器类(空实现)

    c)     客户端,继承b,调用b中的方法,不必直接实现a(直接实现a需要实现a中的所有的方法)

    适配器模式的优点:

    1.     更好的复用性

      系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

    2.     更好的扩展性

    在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

    适配器模式的缺点:

      过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

     

     

    7.    命令模式

    将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作

    将“发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

    实现方式:

    a)     抽象的命令角色 , 如:菜单(规定可以点哪些菜)

    b)     具体的命令角色(实现a 维护一个对c的引用),如:订单(已点的菜)

    c)     接收者(具体执行命令的角色),实际操作时,很常见使用"聪明"命令对象,也就是直接实现了请求,而不是将工作委托给c (弊端?) 如:厨师接收订单后做菜

    d)     调用者(维护一个对a的引用),如:服务员负责点菜并把订单推给厨师

    e)     客户端 调用d发出命令进而执行c的方法,如:顾客点餐

     

    效果:
    1)、command模式将调用操作的对象和实现该操作的对象解耦
    2)、可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
    3)、增加新的command很容易,无需改变已有的类
    适用性:
    1)、抽象出待执行的动作以参数化某对象
    2)、在不同的时刻指定、排列和执行请求。如请求队列
    3)、支持取消操作
    4)、支持修改日志
    5)、用构建在原语操作上的高层操作构造一个系统。支持事物


    8.    组合模式

    将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和复杂对象的使用具有一致性。

    实现方式:

    a)     抽象的构件接口 (规范执行的方法),b及c都需实现此接口,如:Junit中的Test接口

    b)     叶部件(实现a,最小的执行单位),如:Junit中我们所编写的测试用例

    c)     组合类(实现a并维护一个a的集合[多个b的组合]),如:Junit中的 TestSuite

    d)     客户端 可以随意的将b和c进行组合,进行调用

     

    什么情况下使用组合模式:

    当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。

     

     

     

     

     

     

    9.    简单工厂模式

    就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

    实现方式:

    a)     抽象产品类(也可以是接口)

    b)     多个具体的产品类

    c)     工厂类(包括创建a的实例的方法)

     

    优点:

    工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责消费对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

       

    缺点:

    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

     

      

    10. 模板方法模式

    实现方式:

    a)     父类模板类(规定要执行的方法和顺序,只关心方法的定义及顺序,不关心方法实现)

    b)     子类实现类(实现a规定要执行的方法,只关心方法实现,不关心调用顺序)



     

     优点:

            1)封装不变部分,扩展可变部分:把认为不变部分的算法封装到父类实现,可变部分则可以通过继承来实现,很容易扩展。

            2)提取公共部分代码,便于维护。

           3)行为由父类控制,由子类实现。

     缺点:

            模板方法模式颠倒了我们平常的设计习惯:抽象类负责声明最抽象、最一般的事物属性和方法,实现类实现具体的事物属性和方法。在复杂的项目中可能会带来代码阅读的难度。


    dean_hu
    展开全文
  • Java业务开发常见错误100例笔记

    千次阅读 多人点赞 2020-04-03 10:30:07
    原因是,Spring默认通过动态代理的方式实现AOP,对目标方法进行增强,private方法无法代理到,Spring自然也无法动态增强事务处理逻辑 必须通过代理过的类从外部调用目标方法才能生效 2、事务回滚 只有异常传播出了...
  • Python 基础(四): 错误和异常

    千次阅读 多人点赞 2020-01-02 08:31:42
    错误与异常有什么区别?
  • 谓词逻辑及形式系统 (语义)【中】 一、概述 一、什么是语义 简单地说,所谓语义,不管是自然语言的语义还是形式语言的语义,基本上就是两个系统之间的映射关系。自然语言的语义,是语言符号和我们大脑中概念...
  • 但一些难以觉察的错误,可能让应用程序处于高负荷下,更不用说想让缓存有更好的表现了,特别是当你正在使用分布式缓存并且将缓存项存储在不同的缓存服务器或缓存应用程序中时。另外,当缓存在进程外被构建时使用进程...
  • 十大漏洞之逻辑漏洞

    千次阅读 2020-03-13 08:55:22
    常见逻辑漏洞: 交易支付,密码修改,密码找回,越权修改,越权查询,,突破限制等各种逻辑漏洞 不安全的对象引用指的是平行权限的访问控制缺失 A,B同为普通用户,他们之间彼此之间的个人资料应该相互保密的, ...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了精简优化,欢迎...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    hda1中的“1”代表hda的第一个硬盘分区 (partition),hda2代表hda的第二主分区,第一个逻辑分区从hda5开始,依此类推。此外,可以直接检查 /var/log/messages文件,在该文件中可以找到计算机开机后系统已辨认出来的...
  • JAVA的运算符,分为四类:算数运算符、关系运算符、逻辑运算符、位运算符算数运算符(9):+ - * / % ++ --关系运算符(6):== != > >= < <=逻辑运算符(6):&& || ! ^ &...
  • SpringBoot:三五道SpringBoot面试题及答案!

    万次阅读 多人点赞 2019-05-15 23:08:32
    本文精选了三五个常见的Spring Boot知识点,祝你一臂之力! 问题一: Spring Boot、Spring MVC 和 Spring 有什么区别? 1. Spring Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 ...
  • 十种常用的设计模式(大部分自己总结,部分摘抄)

    万次阅读 多人点赞 2017-05-05 13:29:22
    最近公司需要重构一下老项目,所以重新总结了下一些常用的设计模式。(有些内容摘自互联网)
  • 《计算机逻辑基础》作为计算机专业的基础课,学好它也是很有必要的。 从今天开始将进行不定期的总结更新
  • 如有错误,请多指正,我会及时更正错误,并不断补充更新。 计数器 能够统计输入脉冲个数的时序电路 除了用于直接计数外,还可用于定时器、分频器、程序控制器、信号发生器等多种数字设备中。 同步计数器 各个触发器...
  • 组合逻辑电路的分析与设计

    千次阅读 多人点赞 2020-01-17 21:36:47
    1.组合逻辑电路的分析方法 首先给出组合逻辑电路的一般分析方法,如图1.1所示。 图1.1 组合逻辑电路的一般分析方法 以下图的组合逻辑电路为例。 ...
  • 文章目录一、常用组合逻辑电路1. 译码器(1) 二进制译码器 74LS138(3/8译码器)a. 一般符号和图形符号b. 74LS138功能表c. 两片 `74LS138` 构成 `4-16` 译码器:d. 用 `74LS138` 实现函数(2) 二—进制译码器 74LS42a....
  • c语言之逻辑运算符

    千次阅读 2019-08-01 11:34:58
    一、逻辑运算符: 包括:1。&&逻辑与 2。||逻辑或 3。!逻辑逻辑运算符用于对包含关系运算符的表达式进行合并或取非 对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。关于逻辑运算符...
  • 作者:Cheng-Tao Chu‘s LinkedIn在机器学习领域,每个给定的建模问题都存在几十种解法,每个模型又有难以简单判定是否合理的不同假设。在这种情况下,大多数从业人员倾向于挑选他们熟悉的建模算法,本文作者则认为...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息: 14. 接口和抽象类有什么区别? 实现:抽象类...
  • RTL基本知识:Verilog常见错误

    千次阅读 2018-04-22 08:42:00
    【问题描述】 在使用Verilog对硬件逻辑进行...本文列举的错误不仅初学者经常遇到,在一些经验丰富的电路设计人员中也经常会出现这些问题,为此,本文以尽量浅显易懂的方式及示例展示这些常见的问题,希望对于广大...
  • 数电基础:时序逻辑电路

    万次阅读 多人点赞 2019-08-19 08:52:21
    虽然每个数字电路系统可能包含有组合电路,但是在实际应用中绝大多数的系统还包括存储元件,我们将这样的系统描述为时序电路。... 时序逻辑电路是数字逻辑电路的重要组成部分,时序逻辑电路又称时序电路,主...
  • turtle 第四章 数值日期和时间处理 第五章 字符串和文本处理 第六章 文件和数据交换 第七章 数据访问 第八章 网络编程和通信 第九章 并行计算:进程、线程和协程 第二章 系统管理 第一章 Python概述 ...
  • 华为硬件逻辑岗笔试题(一)

    千次阅读 2021-02-25 12:43:38
    积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 ...5. 对组合逻辑的认识 ...6. 对时序逻辑的认识 ...8. 基本时序逻辑电路 ...1、进制46.25对应的二进制表达式为( )。 A 101110.11...
  • 代码排错和避免错误的正确姿势

    千次阅读 多人点赞 2019-04-10 23:24:01
    本文总结一下学习和工作以来思考了一些排错的思路和避免错误的思路积累在这里,希望对大家有帮助,也欢迎大家补充。 1、代码排错和中医理论很相似 发现写代码排查错误可以学学传统中医的诊断方法, 1.1传统...
  • 编码器:由于在二值逻辑电路中,信号是以高低电平给出的,故编码器就是把输入的每一个高低电平信号变成一个对应的二进制代码 编码器分为普通编码器和优先权编码器。根据进制可分为二进制编码器和二-进制编码器 ...
  • 与传统类型漏洞相比,逻辑漏洞具有不易发现、不易防护的特点,不像SQL注入、XSS有像WAF那样现成的防护手段;而且,每个企业的业务逻辑参差不齐,也形成了千奇百怪的逻辑漏洞。 前言 与传统类型漏洞相比,逻辑漏洞...
  • 面试常见逻辑推理题

    千次阅读 2017-06-02 02:21:22
    5.怎样四棵树使得任意两棵树的距离相等。 6.27个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶? 7.有一座山,山上有座庙...
  • 数字逻辑

    千次阅读 2019-12-15 20:59:35
    1.二进制转进制:二进制的小数转换为进制主要是乘以2的负次方,从小数点后开始,依次乘以2的负一次方,2的负二次方,2的负三次方等。 进制转二进制:除二取余法(整数)乘二取整(小数) 2.二进制转八进制:取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,957
精华内容 48,382
关键字:

十种常见的逻辑错误