经过核实后将会做出处理,感谢您为社区和谐做出贡献。
请选择删除原因
确定推荐该回答?
高手帮我解决电脑蓝屏問題啊
31、0xRIVER_IRQL_NOT_LESS_OR_EQUAL ◆错误分析:通常是由有问题的驱动程序引起的(比如罗技鼠标的Logitech MouseWare 9.10和9.24版驱动程序会引发这个故障). 同时,有缺陷的 内存、损坏的虚拟内存文件、某些软件(比如多媒体软件、杀毒软件、备份软件、DVD播放软件)等也会导致这个错误. ◇解决方案:检查最新安装或升级的驱动程序(如果蓝屏中出现&acpi.sys&等类似文件名, 可以非常肯定时驱动程序问题)和软件; 测试内存是否 存在问题; 进入&故障恢复控制台&, 转到虚拟内存页面文件Pagefile.sys所在分区, 执行&del pagefile.sys&命令, 将页面文件删除; 然后在页面文件所在分区执行&chkdsk /r&命令;进入Windows后重新设置虚拟内存.如果在上网时遇到这个蓝屏, 而你恰恰又在进行大量的数据下载和上传(比如:网络游戏、BT下载), 那么应该是网卡驱动的问题, 需要升级其驱动程序. 电脑WIN XP蓝屏错误代码大全查询 在使用Windows系统的时候,经常会出现蓝屏,大多数时候,我们只能reset 一、蓝屏含义 1、故障检查信息 ***STOP 0xxCxFDE38AF9,0xx7E8B0EB4) KMODE_EXCEPTION_NOT_HANDLED ***其中错误的第一部分是停机码(Stop Code)也就是STOP 0x0000001E, 用于识别已发生错误的类型, 错误第二部分是被括号括起来的四个数字集, 表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解, 只有驱动程序编写者或者微软操作系统的开发人员才懂). 第三部分是错误名. 信息第一行通常用来识别生产错误的驱动程序或者设备. 这种信息多数很简洁, 但停机码可以作为搜索项在微软知识库和其他技术资料中使用 2.推荐操作 蓝屏第二部分是推荐用户进行的操作信息. 有时, 推荐的操作仅仅是一般性的建议(比如: 到销售商网站查找BIOS的更新等); 有时, 也就是显示一条与当前问题相关的提示. 一般来说, 惟一的建议就是重启. 3.调试端口告诉用户内存转储映像是否写到磁盘商了, 使用内存转储映像可以确定发生问题的性质, 还会告诉用户调试信息是否被传到另一台电脑商, 以及使用了什么端口完成这次通讯. 不过, 这里的信息对于普通用户来说, 没有什么意义.有时保卫科可以顺利的查到是哪个生产小组的问题, 会在第一部分明确报告是哪个文件犯的错, 但常常它也只能查个大概范围, 而无法明确指明问题所在. 由于工厂全面被迫停止, 只有重新整顿开工, 有时, 那个生产小组会意识到错误 , 不再重犯. 但有时仍然会试图哄抢零件, 于是厂领导不得不重复停工决定(不能启动并显示蓝屏信息, 或在进行相同操作时再次出现蓝屏). 二、蓝屏的处理方法 Windows 2K/XP蓝屏信息非常多, 无法在一篇文章中全面讲解, 但他们产生的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等, 因此首先为大家提供了一些常规的解决方案, 在遇到蓝屏错误时, 应先对照这些方案进行排除. 1.重启 有时只是某个程序或驱动程序一时犯错, 重启后他们会改过自新.(注意:此时参见7.查询停机码) 2.新硬件 首先, 应该检查新硬件是否插牢, 这个被许多人忽视的问题往往会引发许多莫名其妙的故障. 如果确认没有问题, 将其拔下, 然后换个插槽试 试, 并安装最新的驱动程序. 同时还应对照微软网站的硬件兼容类别检查一下硬件是否与操作系统兼容. 如果你的硬件没有在表中, 那么就得到硬件厂商网站进行查询, 或者拨打他们的咨询电话. Windows XP的硬件兼容列表 Windows 2K的硬件兼容类别 3.新驱动和新服务 如果刚安装完某个硬件的新驱动, 或安装了某个软件, 而它又在系统服务中添加了相应项目(比如:杀毒软件、CPU降温软件、防火墙软件等), 在重启或使用中出现了蓝屏故障, 请到安全模式来卸载或禁用它们. 4.检查病毒 比如冲击波和振荡波等病毒有时会导致Windows蓝屏死机, 因此查杀病毒必不可少. 同时一些木马间谍软件也会引发蓝屏, 所以最好再用相关工 具进行扫描检查. 5.检查BIOS和硬件兼容性 对于新装的电脑经常出现蓝屏问题, 应该检查并升级BIOS到最新版本, 同时关闭其中的内存相关项, 比如:缓存和映射. 另外, 还应该对照微软 的硬件兼容列表检查自己的硬件. 还有就是, 如果主板BIOS无法支持大容量硬盘也会导致蓝屏, 需要对其进行升级. 小提示: BIOS的缓存和映射项 Video BIOS Shadowing (视频BIOS映射) Shadowing address ranges(映射地址列) System BIOS Cacheable(系统BIOS缓冲) Video BIOS Cacheable(视频BIOS缓冲) Video RAM Cacheable(视频内存缓冲) 6.检查系统日志 在开始--&菜单中输入:EventVwr.msc, 回车出现&事件查看器&, 注意检查其中的&系统日志&和&应用程序日志&中表明&错误&的项. 7.查询停机码 把蓝屏中密密麻麻的E文记下来, 接着到其他电脑中上网, 进入微软帮助与支持网站, 在左上角的&搜索(知识 库)&中输入停机码, 如果搜索结果没有适合信息, 可以选择&英文知识库&在搜索一遍. 一般情况下, 会在这里找到有用的解决案例. 另外, 在 baidu、Google等搜索引擎中使用蓝屏的停机码或者后面的说明文字为关键词搜索, 往往也会有以外的收获. 8.最后一次正确配置 一般情况下, 蓝屏都出现于更新了硬件驱动或新加硬件并安装其驱动后, 这时Windows 2K/XP提供的&最后一次正确配置&就是解决蓝屏的快捷方 式. 重启系统, 在出现启动菜单时按下F8键就会出现高级启动选项菜单, 接着选择&最后一次正确配置&. 9.安装最新的系统补丁和Service Pack 有些蓝屏是Windows本身存在缺陷造成的, 应此可通过安装最新的系统补丁和Service Pack来解决. 三、蓝屏代码含义和解决方案 1、0x0000000A:IRQL_NOT_LESS_OR_EQUAL ◆错误分析:主要是由问题的驱动程序、有缺陷或不兼容的硬件与软件造成的. 从技术角度讲. 表明在内核模式中存在以太高的进程内部请求级 别(IRQL)访问其没有权限访问的内存地址. ◇解决方案:请用前面介绍的解决方案中的2、3、5、8、9方案尝试排除. 2、0x:TRAP_CAUSE_UNKNOWN ◆错误分析:如果遇到这个错误信息, 那么很不幸, 应为KeBudCheck分析的结果是错误原因 未知. ◇解决方案:既然微软都帮不上忙, 就得靠自己了, 请仔细回想这个错误是什么时候出现的; 第一次发生时你对系统做了哪些操作; 发生时正在 进行什么操作. 从这些信息中找出可能的原因, 从而选择相应解决方案尝试排除. 3、0x0000001A:MEMORY_MANAGEMENT ◆错误分析:这个内存管理错误往往是由硬件引起的, 比如: 新安装的硬件、内存本身有问题等. ◇解决方案:如果是在安装Windows时出现, 有可能是由于你的电脑达不到安装Windows的最小内存和磁盘要求. 4、0x0000001E:KMODE_EXCEPTION_NOT_HANDLED ◆错误分析:Windows内核检查到一个非法或者未知的进程指令, 这个停机码一般是由问题的内存或是与前面0x0000000A相似的原因造成的. ◇解决方案: (1)硬件兼容有问题:请对照前面提到的最新硬件兼容性列表, 查看所有硬件是否包含在该列表中. (2)有问题的设备驱动、系统服务或内存冲突和中断冲突: 如果在蓝屏信息中出现了驱动程序的名字, 请试着在安装模式或者故障恢复控制台中 禁用或删除驱动程序, 并禁用所有刚安装的驱动和软件. 如果错误出现在系统启动过程中, 请进入安全模式, 将蓝屏信息中所标明的文件重命 名或者删除. (3)如果错误信息中明确指出Win32K.sys: 很有可能是第三方远程控制软件造成的, 需要从故障恢复控制台中将对该软件的服务关闭. (4)在安装Windows后第一次重启时出现:最大嫌疑可能时系统分区的磁盘空间不足或BIOS兼容有问题. (5)如果是在关闭某个软件时出现的:很有可能时软件本省存在设计缺陷, 请升级或卸载它. 5、0x:FAT_FILE_SYSTEM 0x:NTFS_FILE_SYSTEM ◆错误分析:0x通常发生在读写FAT16或者FAT32文件系统的系统分区时, 而 0x则是由于NTFS.sys文件出现错误(这个驱动文件的作用是容许系统读写使用 NTFS文件系统的磁盘). 这两个蓝屏错误很有可能是磁盘本身存在物理损坏, 或是中断要求封包(IRP)损坏而导致的. 其他原因还包括:硬盘磁盘 碎片过多; 文件读写操作过于频繁, 并且数据量非常达或者是由于一些磁盘镜像软件或杀毒软件引起的. ◇解决方案: 第一步:首先打开命令行提示符, 运行&Chkdsk /r&(注:不是CHKDISK, 感觉象这个, 但是……)命令检查并修复硬盘错误, 如果报告存在怀道 (Bad Track), 请使用硬盘厂商提供的检查工具进行检查和修复. 第二步:接着禁用所有即使扫描文件的软件, 比如:杀毒软件、防火墙或备份工具. 第三步:右击C:\winnt\system32\drivers\fastfat.sys文件并选择&属性&, 查看其版本是否与当前系统所使用的Windows版本相符.(注:如果是 XP, 应该是C:\windows\system32 \drivers\fastfat.sys) 第四步:安装最新的主板驱动程序, 特别IDE驱动. 如果你的光驱、可移动存储器也提供有驱动程序, 最好将它们升级至最新版. 6、0x:RDR_FILE_SYSTEM ◆错误分析:这个错误产生的原因很难判断, 不过Windows内存管理出了问题很可能会导致这个停机码的出现. ◇解决方案:如果是内存管理的缘故, 通常增加内存会解决问题. 7、0x0000002EATA_BUS_ERROR ◆错误分析:系统内存存储器奇偶校验产生错误, 通常是因为有缺陷的内存(包括物理内存、二级缓存或者显卡显存)时设备驱动程序访问不存在 的内存地址等原因引起的. 另外, 硬盘被病毒或者其他问题所损伤, 以出现这个停机码. ◇解决方案: (1)检查病毒 (2)使用&chkdsk /r&命令检查所有磁盘分区. (3)用Memtest86等内存测试软件检查内存. (4)检查硬件是否正确安装, 比如:是否牢固、金手指是否有污渍. 8、0x:NO_MORE_IRP_STACK_LOCATIONS ◆错误分析:从字面上理解, 应该时驱动程序或某些软件出现堆栈问题. 其实这个故障的真正原因应该时驱动程序本省存在问题, 或是内存有质 量问题. ◇解决方案:请使用前面介绍的常规解决方案中与驱动程序和内存相关的方案进行排除. 9、0x0000003F:NO_MORE_SYSTEM_PTES ◆错误分析:一个与系统内存管理相关的错误, 比如:由于执行了大量的输入/输出操作, 造成内存管理出现问题: 有缺陷的驱动程序不正确地使 用内存资源; 某个应用程序(比如:备份软件)被分配了大量的内核内存等. ◇解决方案:卸载所有最新安装的软件(特别是哪些增强磁盘性能的应用程序和杀毒软件)和驱动程序. 10、0x:MULTIPLE_IRP_COMPLIETE_REQUESTS ◆错误分析:通常是由硬件驱动程序引起的. ◇解决方案:卸载最近安装的驱动程序. 这个故障很少出现, 目前已经知道的是, 在使用 这家公司的某些软件时会出现, 其中的罪魁就是Falstaff.sys文件.(作者难道不怕吃官司嘛, 把公司网址公布) 11、0x: PAGE_FAULT_IN_NONPAGED+AREA ◆错误分析:有问题的内存(包括屋里内存、二级缓存、显存)、不兼容的软件(主要是远程控制和杀毒软件)、损坏的NTFS卷以及有问题的硬件( 比如: PCI插卡本身已损坏)等都会引发这个错误. ◇解决方案:请使用前面介绍的常规解决方案中与内存、软件、硬件、硬盘等相关的方案进 行排除. 12、0x:REGISTRY_ERROR ◆错误分析:这个停机码说明注册表或系统配置管理器出现错误, 由于硬盘本身有物理损坏或文件系统存在问题, 从而造成在读取注册文件时出 现输入/输出错误. ◇解决方案:使用&chkdsk /r&检查并修复磁盘错误. 13、0x:FTDISK_INTERNAL_ERROR ◆错误分析:说明在容错集的主驱动发生错误. ◇解决方案:首先尝试重启电脑看是否能解决问题, 如果不行, 则尝试&最后一次正确配置&进行解决. 14、0x0000005E:CRITICAL_SERVICE_FAILED ◆错误分析:某个非常重要的系统服务启动识别造成的. ◇解决方案:如果是在安装了某个新硬件后出新的, 可以先移除该硬件, 并通过网上列表检查它是否与Windows 2K/XP兼容, 接着启动电脑, 如 果蓝屏还是出现, 请使用&最后一次正确配置&来启动Windows, 如果这样还是失败, 建议进行修复安装或是重装. 15、0x0000006F:SESSION3_INITIALIZATION-FAILED ◆错误分析:这个错误通常出现在Windows启动时, 一般是由有问题的驱动程序或损坏的系统文件引起的. ◇解决方案:建议使用Windows安装光盘对系统进行修复安装. 16、0xROCESS_HAS_LOCKED_PAGES ◆错误分析:通常是因为某个驱动程序在完成了一次输入/输出操作后, 没有正确释放所占有的内存 ◇解决方案: 第一步:点击开始--&运行:regedt32, 找到[HKLM\SYSTEM\Currentcontrol set\control\session manager\memory management], 在右侧新建双 字节值&TrackLockedPages&, 值为1. 这样Windows便会在错误再次出现时跟踪到是哪个驱动程序的问题.第二步:如果再次出现蓝屏, 那么错误 信息会变成:STOP:0x0000000CB(0xY,0xY,0xY,0xY)DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS其中第四个&0xY&会显示为问题驱动程序的名字, 接 着对其进行更新或删除.第三步:进入注册表, 删除添加的&TrackLockedPages&. 17、0x:KERNEL_STACK_INPAGE_ERROR ◆错误分析:说明需要使用的内核数据没有在虚拟内存或物理内存中找到. 这个错误常常于是着磁盘有问题, 相应数据损坏或受到病毒侵蚀. ◇解决方案:使用杀毒软件扫描系统; 使用&chkdsk /r&命令检查并修复磁盘错误, 如不行则使用磁盘厂商提供的工具检查修复. 18、0x0000007A:KERNEL_DATA_INPAGE_ERROR ◆错误分析:这个错误往往是虚拟内存中的内核数据无法读入内存造成的. 原因可能是虚拟内存页面文件中存在坏簇、病毒、磁盘控制器出错、 内存有问题. ◇解决方案:首先用升级为最新病毒库杀毒软件查杀病毒, 如果促无信息中还0xC000009C 或0xC000016A代码, 那么表示是坏簇造成的, 并且系统的磁盘检测工具无法自动修复, 这时要进入&故障恢复控制台&, 用&chkdsk /r&命令进行 手动修复. 19、0x0000007B:INACESSIBLE_BOOT_DEVICE ◆错误分析:Windows在启动过程中无法访问系统分区或启动卷. 一般发生在更换主板后第一次启动时, 主要是因为新主板和旧主板的IDE控制器 使用了不同芯片组造成的. 有时也可能是病毒或硬盘损伤所引起的. ◇解决方案:一般只要用安装光盘启动电脑, 然后执行修复安装即可解决问题. 对于病毒则可使用DOS版的杀毒软件进行查杀(主战有kv2005DOS 版下载). 如果是硬盘本身存在问题, 请将其安装到其他电脑中, 然后使用&chkdsk /r&来检查并修复磁盘错误. 20、0x0000007E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED ◆错误分析:系统进程产生错误, 但Windows错误处理器无法捕获. 其产生原因很多, 包括:硬件兼容性、有问题的驱动程序或系统服务、或者 是某些软件. ◇解决方案:请使用&事件查看器&来获取更多的信息, 从中发现错误根源.(发现好像不是解决哦, 看来这里大家要自力更生了!) 21、0x0000007F:UNEXPECTED_KERNEL_MOED_TRAP ◆错误分析:一般是由于有问题的硬件(比如:内存)或某些软件引起的. 有时超频也会产生这个错误. ◇解决方案:用检测软件(比如:Memtest86)检查内存, 如果进行了超频, 请取消超频. 将PCI硬件插卡从主板插槽拔下来, 或更换插槽. 另外, 有些主板(比如:nForce2主板)在进行超频后, 南桥芯片过热也会导致蓝屏, 此时为该芯片单独增加散热片往往可以有效解决问题. 22、0x:NMI_HARDWARE_FAILURE ◆错误分析:通常是有硬件引起的.(似乎蓝屏与硬件错误有不解之缘) ◇解决方案:如果最近安装了新硬件, 请将其移除, 然后试试更换插槽和安装最新的驱动程序, 如果升级了驱动程序, 请恢复后原来的版本; 检 查内存金手指是否有污染和损坏; 扫描病毒; 运行&chkdsk /r&检查并修复磁盘错误; 检查所有硬件插卡已经插牢. 如果以上尝试都无效果, 就 得找专业的电脑维修公司请求帮助了. 23、0x0000008E:KERNEL_MODE_EXCEPTION_NOT_HANDLED ◆错误分析:内核级应用程序产生了错误, 但Windows错误处理器没有捕获. 通常是硬件兼容性错误. ◇解决方案:升级驱动程序或升级BIOS. 24、0x0000009C:MACHINE_CHECK_EXCEPTION ◆错误分析:通常是硬件引起的. 一般是因为超频或是硬件存在问题(内存、CPU、总线、电 源). ◇解决方案:如果进行了超频, 请降会CPU原来频率, 检查硬件. 25、0x0000009FRIVER_POWER_STATE_FAILURE ◆错误分析:往往与电源有关系, 常常发生在与电源相关的操作, 比如:关机、待机或休睡. ◇解决方案:重装系统, 如果不能解决, 请更换电源. 26、0x:ACPI_BIOS_ERROR ◆错误分析:通常是因为主板BIOS不能全面支持ACPI规范. ◇解决方案:如果没有相应BIOS升级, 那么可在安装Windows 2K/XP时, 当出现&press F6 if you need to install a third-party SCSI or RAID driver&提示时, 按下F7键, 这样Windows便会自动禁止安装ACPI HAL, 而安装 Standard PC HAL. 27、0x:VIDEO_DRIVER_INIT_FAILURE ◆错误分析:这个停止信息表示Windows因为不能启动显卡驱动, 从而无法进入图形界面. 通常是显卡的问题, 或者是存在与显卡的硬件冲突(比 如:与并行或串行端口冲突). ◇解决方案:进入安全模式查看问题是否解决, 如果可以, 请升级最新的显卡驱动程序, 如果还不行, 则很可能是显卡与并行端口存在冲突, 需 要在安全模式按下WIN+break组合键打开&系统属性&, 在硬件--&设备管理器中找到并双击连接打印的LPT1端口的项, 在&资源&选项卡中取消&使 用自动配置&的构选, 然后将&输入/输出范围&的&03BC&改为&0378&. 28、0x000000BE:ATTEMPTED_WRITE_TO_READONLY_MEMORY ◆错误分析:某个驱动程序试图向只读内存写入数据造成的. 通常是在安装了新的驱动程序, 系统服务或升级了设备的固件程序后. ◇解决方案:如果在错误信息中包含有驱动程序或者服务文件名称, 请根据这个信息将新安装的驱动程序或软件卸载或禁用. 29、0x:BAD_POOL_CALLER ◆错误分析:一个内核层的进程或驱动程序错误地试图进入内存操作. 通常是驱动程序或存在BUG的软件造成的. ◇解决方案:请参考前面介绍的常规解决方案相关项目进行排除. 30、0x000000CERIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS ◆错误分析:通常是由有问题的驱动程序或系统服务造成的. ◇解决方案:请参考前面介绍的常规解决方案相关项目进行排除. 31、0xRIVER_IRQL_NOT_LESS_OR_EQUAL ◆错误分析:通常是由有问题的驱动程序引起的(比如罗技鼠标的Logitech MouseWare 9.10和9.24版驱动程序会引发这个故障). 同时,有缺陷的 内存、损坏的虚拟内存文件、某些软件(比如多媒体软件、杀毒软件、备份软件、DVD播放软件)等也会导致这个错误. ◇解决方案:检查最新安装或升级的驱动程序(如果蓝屏中出现&acpi.sys&等类似文件名, 可以非常肯定时驱动程序问题)和软件; 测试内存是否 存在问题; 进入&故障恢复控制台&, 转到虚拟内存页面文件Pagefile.sys所在分区, 执行&del pagefile.sys&命令, 将页面文件删除; 然后在 页面文件所在分区执行&chkdsk /r&命令;进入Windows后重新设置虚拟内存.如果在上网时遇到这个蓝屏, 而你恰恰又在进行大量的数据下载和 上传(比如:网络游戏、BT下载), 那么应该是网卡驱动的问题, 需要升级其驱动程序. 32、0x000000EA:THREAD_STUCK_IN_DEVICE_DRIVER ◆错误分析:通常是由显卡或显卡驱动程序引发的. ◇解决方案:先升级最新的显卡驱动, 如果不行, 则需要更换显卡测试故障是否依然发生. 33、0x000000ED:UNMOUNTABLE_BOOT_VOLUME ◆错误分析:一般是由于磁盘存在错误导致的, 有时也建议检查硬盘连线是否接触不良, 或是没有使用合乎该硬盘传输规格的连接线, 例如ATA -100仍使用ATA-33的连接线, 对低速硬盘无所谓, 但告诉硬盘(支持ATA-66以上)的要求较严格, 规格不对的连线有时也会引起这类没办法开机 的故障. 如果在修复后, 还是经常出现这个错误, 很可能是硬盘损坏的前兆. ◇解决方案:一般情况下, 重启会解决问题, 不管怎么样都建议执行&chkdsk /r&命令来检查修复硬盘 34、0x:HARDWARE)INTERRUPT_STORM ◆错误分析:内核层检查到系统出现中断风暴, 比如:某个设备在完成操作后没有释放所占用 的中断. 通常这是由缺陷的驱动程序造成的. ◇解决方案:升级或卸载最新安装的硬件驱动程序. 35、0x:UNABLE_TO_LOCATE_DLL ◆错误分析:通常表示某个文件丢失或已经损坏, 或者是注册表出现错误. ◇解决方案:如果是文件丢失或损坏, 在蓝屏信息中通常会显示相应的文件名, 你可以通过网络或是其他电脑找到相应的文件, 并将其复制到系 统文件夹下的SYSTEM32子文件夹中. 如果没有显示文件名, 那就很有可能是注册表损坏, 请利用系统还原或是以前的注册表备份进行恢复. 36、0x0000021A:STATUS_SYSTEM_PROCESS_TERMINATED ◆错误分析:用户模式子系统, 例如Winlogon或客服服务运行时子系统(CSRSS)已损坏, 所以无法再保证安全性, 导致系统无法启动. 有时, 当 系统管理员错误地修改了用户帐号权限, 导致其无法访问系统文件和文件夹. ◇解决方案:使用&最后一次正确的配置&, 如果无效, 可使用安装光盘进行修复安装. 37、STOP 0xC0000221 or STATUS_IMAGE_CHECKSUM_MISMATCH ◆错误分析:通常是由于驱动程序或系统DLL文件损坏造成的. 一般情况下, 在蓝屏中会出现 文件名称 ◇解决方案: (1)使用Windows安装光盘进行修复安装; (2)如果还能进入安全模式, 可以&开始--&运行&: sfc /scannow (3)还可以采用提取文件的方法来解决, 进入&故障恢复控制台&, 使用copy或expand命令从光盘中复制或解压受损的文件. 不过, 蓝屏一般都是 驱动程序文件的问题, 所以expand命令会用的都一些, 比如:蓝屏中提示tdi.sys文件, 因为驱动文件一般在i386\driver压缩包里, 所以使用: expand %CDROM:\i386\driver.cab \f:tdi.sys c:\winnt\system\drivers.(xp为expand %CDROM:\i386\driver.cab \f:tdi.sys c:\windowns\system\drivers) 38、如果启动时出现这些蓝屏停机码 如果在Windows启动时出现蓝屏, 并出现附表一中的错误信息, 那么多半时硬件出现了问题, 请用硬件厂商提供的诊断工具来判断硬件是否存在 问题, 并到其网站查看是否有最新的BIOS或固件更新程序. 如果硬件没有问题, 重装Windows 2K/XP, 若相同问题还是出现, 就只能求助专业的技术支持了. 如果遇到的时附表二中的错误信息, 也只有重装Windows了, 如果不能解决问题, 建议求救专业的技术支持. 参考资料:404 Not Found
404 Not Found第1章 代码无错就是优? -- 简单工厂模式
实例程序: 计算器代码.
初学者问题:
命名规范, 条件判断, 异常情况处理.
面向对象编程:
通过封装, 继承, 多态把程序的耦合度降低.
容易维护, 扩展, 复用.
举例: 活字印刷.
封装业务逻辑, 与界面分开.
用继承和多态, 分离各种运算, 使程序可以灵活修改和扩展(增加开根运算).
简单工厂模式: 处理实例化逻辑.
第2章 商场促销 -- 策略模式
实例程序: 商场收银软件.
基本需求: 根据商品单价和数量, 计算费用.
扩展需求: 增加不同的打折和满减优惠活动.
简单工厂实现
相同属性和功能的对象的抽象集合才是类, 所以不用为每一种折扣写一个子类.
收费抽象类有三个子类: 正常收费; 打折收费; 返利收费.
缺点: 由于工厂本身包括了所有的收费方式, 商场是可能经常性地更改打折额度和返利额度, 每次维护或扩展收费方式都要改动这个工厂, 以致代码需要重新编译部署, 所以它不是最好的方法.
策略模式 Strategy
策略模式(Strategy): 它定义了算法家族, 分别封装起来, 让它们之间可以互相替换, 此模式让算法的变化, 不会影响到使用算法的客户.
实现: 增加一个Context类, 维护一个对Strategy对象的引用. 这个Context类被客户端持有.
进一步优化: 策略模式与简单工厂结合. 将创建具体Strategy的过程移入Context类.
策略模式的优点
减少了各种算法类与使用算法类之间的耦合.
继承有助于析取一系列算法中的公共功能.
每个算法有自己的类, 可以单独做单元测试.
算法修改独立.
消除客户端条件语句, 避免了大量判断. (Context中仍然有switch语句, 进一步改进: 反射. 后续章节会讲.)
第3章 拍摄UFO -- 单一职责原则
场景: 散步偶遇天空中的不明飞行物, 用手机拍摄后拿回家看不清. 手机不如专业的相机.
单一职责原则
单一职责原则(SRP): 就一个类而言, 应该仅有一个引起它变化的原因.
如果一个类承担的职责过多, 就等于把这些职责耦合在一起, 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力. 这种耦合会导致脆弱的设计, 当变化发生时, 设计会遭受到意想不到的破坏.
俄罗斯方块游戏的设计
考虑在不同平台上的程序逻辑复用, 将游戏逻辑和界面表示部分分离.
方块可移动区域: 二维整型数组, 数组的值为是否存在方块的标志, 存在为1, 不存在为0.
碰撞和消层变为数值检测判断. 下落, 旋转, 移动等都是在做数组具体项的值的变化.
界面表示逻辑根据数据进行绘制, 根据键盘命令调用数组的相应方法进行改变.
第4章 考研求职两不误 -- 开放-封闭原则
场景: 考研失败, 没有找工作.
举例: 一国两制.
开放-封闭原则
开放-封闭原则, 是说软件实体(类, 模块, 函数等) 应该可以扩展, 但是不可修改.
对于扩展是开放的, 对于更改是封闭的.
面对需求, 对程序的改动是通过增加代码进行的, 而不是更改现有的代码.
应该仅仅对呈现出频繁变化的那部分做出抽象, 对于应用程序中每个部分都刻意地进行抽象同样不是一个好主意. 拒绝不成熟的抽象和抽象本身一样重要.
第5章 会修电脑不会修收音机? -- 依赖倒转原则
场景: MM电脑蓝屏死机, 电话遥控修电脑, 拆掉一根内存条.
PC易插拔, 不管哪一个部件出问题, 都可以在不影响别的部件的前提下进行修改或替换.
强内聚, 松耦合.
依赖倒转原则
高层模块不应该依赖底层模块, 两个都应该依赖抽象.
抽象不应该依赖于细节, 细节应该依赖于抽象.
要针对接口编程, 不要针对实现编程.
如果高层模块和底层模块都依赖于抽象(接口或抽象类), 只要接口是稳定的, 那么无论是高层模块还是低层模块都可以很容易地被复用.
里氏代换原则
里氏代换原则(LSP): 子类型必须能够替换它们的父类型.
由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展.
收音机就是典型的耦合过度, 各个部件相互依赖, 难以维护.
第6章 穿什么有这么重要? -- 装饰模式
代码: 搭配服饰的系统.
增加装扮 -& 开放-封闭原则. -& 抽象类, 继承.
把所需的功能按正确的顺序串联起来进行控制. -& 装饰模式.
装饰模式 Decorator
装饰模式(Decorator), 动态地给一个对象添加一些额外的职责, 就增加功能来说, 装饰模式比生成子类更为灵活.
装饰模式把每个要装饰的功能放在单独的类中, 并让这个类包装它所要装饰的对象, 因此, 当需要执行特殊行为时, 客户代码就可以在运行时根据需要有选择地, 按顺序地使用装饰功能包装对象了.
第7章 为别人做嫁衣 -- 代理模式
场景例子: 男生A想追求女生C, 但是他们并不认识, 于是A委托一个认识C的男生B, 向C送礼物.
程序设计: 两个男生实现了同样的接口, 接口中规定了送礼物的各种方法.
追求者包含要追求的女生对象和具体的送礼物方法, 而代理追求者包含追求者对象, 其方法实现调用追求者对象的对应方法.
代理模式 Proxy
代理模式(Proxy), 为其他对象提供一种代理以控制对这个对象的访问.
代理模式应用:
远程代理: 为一个对象在不同的地址空间提供局部代表.
虚拟代理: 根据需要创建开销很大的对象. 通过它来存放实例化需要很长时间的真实对象.
安全代理: 用来控制真实对象访问时的权限.
智能指引: 当调用真实对象时, 代理处理另外一些事.
第8章 雷锋依然在人间 -- 工厂方法模式
背景故事: 有个学雷锋做好事的同学病了, 请其他同学帮忙去孤寡老人家里干活.
计算器程序的两种实现:
简单工厂模式实现: switch-case.
工厂方法模式实现: 每种算法对应一个工厂.
简单工厂 vs. 工厂方法
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断, 根据客户端的选择条件动态实例化相关的类, 对于客户端来说, 去除了与具体产品的依赖.
简单工厂的缺点: 对扩展和修改都开放, 违背了开-闭原则.
工厂方法模式 Factory Method
工厂方法模式(Factory Method), 定义一个用于创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类.
符合开-闭原则, 却把选择逻辑放在了客户端.
以简单工厂和工厂方法模式实现学雷锋的例子. 工厂方法克服了简单工厂违反开-闭原则的缺点, 如果要更换对象, 不需要大的改动, 只要更换工厂就可以.
第9章 简历复印 -- 原型模式
程序需求: 写一个简历类, 可以设置基本信息和工作经历. 最终产生工作经历不同的多份简历.
问题: 三份简历需要三次实例化, 如何避免多次实例化?
原型模式 Prototype
原型模式(Prototype), 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象.
原型模式其实就是从一个对象再创建另外一个可定制的对象, 而且不需知道任何创建的细节.
.Net中提供了ICloneable接口.
一般在初始化的信息不发生变化的情况下, 克隆是最好的办法. 既隐藏了对象创建的细节, 又对性能是大大的提高.
浅复制与深复制
浅复制: 被复制对象的所有变量都含有与原来的对象相同的值, 而所有的对其他对象的引用都仍然指向原来的对象.
浅复制对于值类型没什么问题, 对于引用类型, 就只是复制了引用, 对引用的对象还是指向了原来的对象.
深复制把引用对象的变量指向复制过的新的对象, 而不是原有的被引用的对象.
第10章 考题抄错会做也白搭 -- 模板方法模式
程序例子: 学生抄题然后解答.
程序1: 学生分别抄题然后给出答案.
问题: 如果老师要改题, 就得修改多处, 而且也存在某些学生可能会抄错的问题.
改进1: 抽出父类, 处理抄题部分, 只有答题部分不同, 由子类完成.
改进2: 答题部分也有部分内容相同, 只有答案不同. -& 在基类中增加虚方法, 填写答案, 由子类覆写填答案.
模板方法模式
模板方法模式, 定义一个操作中的算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
模板方法模式通过把不变行为搬移到超类, 去除子类中的重复代码.
第11章 无熟人难办事? -- 迪米特法则
场景: 小菜第一天上班, 人事处带他去IT部门找一个小张领电脑装电脑. 结果小张临时出去处理其他事情, 于是小菜就一直等, 而IT部的另外两个员工很闲却不帮忙, 因为单子上写的是小张负责. 于是小菜等了一天, 快结束时小张回来才帮他处理.
问题: 如果公司IT部门有主管, 或者有事直接是整个IT部门负责, 就不会出现具体到个人的资源分配问题. -& 面向接口编程.
迪米特法则
迪米特法则, 如果两个类不必彼此直接通信, 那么这两个类就不应当发生直接的相互作用. 如果其中一个类需要调用另一个类的某一个方法的话, 可以通过第三者转发这个调用.
在类的结构设计上, 每一个类都应当尽量降低成员的访问权限.
第12章 牛市股票还会亏钱? -- 外观模式
举例: 股民炒股, 投资多个股票, 自己不易掌握, 买基金, 由专业的经理人进行管理. -& 解除耦合, 外观模式, 又叫门面模式.
外观模式 Facade
外观模式(Facade), 为子系统中的一组接口提供一个一致的界面, 此模式定义了一个高层接口, 这个接口使得这一子系统更加容易使用.
何时使用外观模式:
设计初期的逻辑分层.
开发阶段增加外观提供简单接口.
维护遗留系统.
第13章 好菜每回味不同 -- 建造者模式
场景: 大排档的饭, 一份好吃, 另一份忘了放盐. 中式快餐依赖于厨师.
提出问题: 为什么麦当劳肯德基的食物口吻稳定? -& 工作流程规范稳定.
程序需求: 画小人程序, 画不同的小人, 如何复用程序, 避免关键部分缺失? -& 建造者模式, 又叫生成器模式.
建造者模式 Builder
建造者模式(Builder), 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示.
Builder为创建一个Product对象的各个部件指定的抽象接口.
ConcreteBuilder是具体的建造者, 实现Builder接口, 构造和装配各个部件.
Director指挥者, 指挥建造过程, 使用ConcreteBuilder构建产品.
建造者模式是当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式.
第14章 老板回来, 我不知道 -- 观察者模式
场景: 公司同事讨论股票, 如果老板回来, 秘书则打电话通知大家.
代码实现, 解耦1: 抽象的观察者; 解耦2: 抽象的通知者接口.
观察者模式
观察者模式又叫发布-订阅(Publish/Subscribe)模式.
观察者模式定义了一种一对多的依赖关系, 让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时, 会通知所有观察者对象, 使它们能够自动更新自己.
关键类: Subject, ConcreteSubject, Observer, ConcreteObserver.
观察者模式的不足: 有可能所有观察者对象是已经写好的控件, 它们没有办法实现同一个观察者接口; 每个具体的观察者, 有可能是不同的方法需要被调用.
事件委托实现
多个观察者没有共同的基类, 并且有各自不同名字的更新方法.
此时通知者无法遍历通知 -& 委托(.Net中的delegate).
首先声明一个委托类型EventHandler. 在通知者类中声明委托事件.
注册观察者时将观察者的更新方法挂钩到通知者的这个委托事件上. 在通知者通知时调用该委托事件.
委托就是一种引用方法的类型. 一旦为委托分配了方法, 委托将与该方法具有完全相同的行为. 委托可以看作是对函数的抽象, 是函数的&类&, 委托的实例将代表一个具体的函数.
一个委托可以搭载多个方法, 所有方法被依次唤起.
前提: 委托对象所搭载的所有方法必须具有相同的参数列表和返回值类型.
场景: 有同学的手机丢了, 委托小菜给班级所有同学发个短信通知其他人该同学已经换号, 请大家更新号码.
第15章 就不能不换DB吗? -- 抽象工厂模式
场景: 公司有两个项目业务相同, 但是要用两种数据库.
例子代码存在的问题: 直接创建了具体的数据库操作类.
解决方法: 用工厂方法模式. 工厂方法模式定义一个用于创建对象的接口, 让子类决定实例化哪一个类.
代码改进1: 抽象出对数据库的一个表的访问接口, 解除与具体数据库访问的耦合.
并定义抽象工厂接口, 由具体的工厂实现实例化.
依然存在问题: 依然存在很多指明具体工厂的代码.
代码改进2: 增加了对数据库其他表的访问接口. 涉及到多个产品系列的问题 -& 抽象工厂模式.
抽象工厂模式 Abstract Factory
抽象工厂模式(Abstract Factory), 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们具体的类.
易于交换产品系列. 只需要改变一个具体的工厂.
具体的创建实例过程与客户端分离, 客户端通过接口操纵实例.
(开放-封闭原则, 倒转依赖原则).
增加功能时要改动的类比较多.
实例化具体工厂的地方比较多, 替换实现时仍需要更改多处.
用简单工厂来改进抽象工厂
去掉了工厂类, 增加一个数据访问类, 其中用简单工厂模式来决定实例化哪些具体的数据库访问类.
缺点: 如果要增加一系列的实现, 需要在简单工厂类的每个方法switch中增加case.
用反射 + 抽象工厂的数据访问程序
解决思路1: 依赖注入框架.
解决思路2: 反射.
利用字符串来实例化对象, 而变量是可以更换的.
问题: 更改数据库还是需要去改程序(db名称)重新编译.
改进: 用配置文件来解决更改变量的问题.
第16章 无尽加班何时休 -- 状态模式
程序: 不同的时间对应不同的工作状态.
代码的坏味道: 方法过长, 有很多的判断分支.
违背了单一职责原则和开放-封闭原则.
状态模式 State
状态模式(State), 当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类.
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况. 把状态的判断逻辑转移到表示不同状态的一系列类当中, 可以把复杂的判断逻辑简化.
状态模式的好处是将与特定状态相关的行为局部化, 并且将不同状态的行为分割开来.
状态模式通过把各种状态转移逻辑分布到State的子类之间, 来减少相互间的依赖.
什么时候考虑使用状态模式?
当一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为时, 就可以考虑使用状态模式了.
第17章 在NBA我需要翻译 -- 适配器模式
背景: 姚明刚去NBA时需要翻译.
适配器模式 Adapter
适配器模式(Adapter), 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.
联想: 电源适配器, 翻译.
类适配器模式: 通过多重继承. (某些语言不支持.)
对象适配器模式: 利用包含.
何时使用适配器模式?
使用一个已经存在的类, 但如果它的接口, 也就是它的方法和你的要求不相同时, 就应该考虑用适配器模式.
通常是在开发后期或维护期再考虑使用适配器模式; 在设计初期, 应该尽量为类似的功能设计相同的接口, 或考虑通过重构统一接口.
在双方都不太容易修改时使用适配器模式: 比如使用第三方组件.
.Net中的DataAdapter.
扁鹊三兄弟医术的例子: 事后控制不如事中控制, 事中控制不如事前控制.
适配器模式是后期才考虑的一个模式.
第18章 如果再回到从前 -- 备忘录模式
背景: 游戏存档, 下棋悔棋, 文档中的撤销, 网页中的后退.
程序: 游戏角色的数据存档.
第一版程序的缺点: 游戏角色的细节暴露给了客户端, 保存和恢复都暴露了实现细节, 不好扩展和修改.
备忘录模式 Memento
备忘录(Memento): 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象恢复到原先保存的状态.
Originator: 发起人, 负责创建一个备忘录Memento, 用以记录当前时刻它的内部状态, 并可使用备忘录恢复内部状态. Originator可根据需要决定Memento存储哪些内部状态.
Memento: 备忘录, 负责存储Originator对象的内部状态, 并可防止Originator以外的其他对象访问备忘录.
Caretaker: 管理者, 负责保存好备忘录(Memento), 不能对备忘录的内容进行操作或检查.
全部状态保存可以用clone的方式实现, 更多可能的情况是保存部分状态, 用备忘录.
备忘录模式适用于功能比较复杂的, 需要维护或记录属性历史的类, 或者需要保存的属性只是众多属性中的一小部分时.
使用命令模式时, 如果需要实现命令的撤销功能, 那么可以使用备忘录模式来存储可撤销操作的状态.
一些对象的内部信息必须保存在对象以外的地方, 但是必须要由对象自己读取. 这时使用备忘录可以把复杂对象内部信息对其他的对象屏蔽起来.
当角色状态改变的时候, 有可能这个状态无效, 这时候可以使用暂时存起来的备忘录将状态复原.
第19章 分公司 = 一部门 -- 组合模式
场景: 为一个有很多分公司的大公司写OA系统. 每个分公司, 办事处和总公司一样都有相应的人力, 财务等部门, 但系统要求总部和分公司不是平行的, 仍保持一定的树状结构.
分析: 整体与部分可以一致对待.
例子: 卖电脑的商家可以卖电脑和配件; 复制文件可以逐个文件复制也可以复制文件夹; 文本编辑, 单个文字和整段文字都可以更改样式.
组合模式 Composite
组合模式(Composite), 将对象组合成树形结构以表示'部分-整体'的层次结构, 组合模式使得用户对单个对象和组合对象的使用具有一致性.
Component: 组合中的对象声明接口.
Leaf: 叶子节点.
Composite: 有枝节点.
透明方式: Component中声明所有用来管理子对象的方法. 好处: 叶子节点和枝节点对外没有区别, 具备完全一致的行为接口. 问题: 叶子节点中的一些方法实现是没有意义的.
安全方式: Component中不去声明用于管理子对象的方法. 好处: 叶子节点不用实现这些方法. 问题: 不够透明, 树叶和树枝将不具有相同的接口, 客户端的调用需要做相应的判断.
何时使用组合模式:
需求中是提现部分与整体的层次结构.
希望用户可以忽略组合对象与单个对象的区别.
例子: 自定义控件.
第20章 想走? 可以! 先买票 -- 迭代器模式
场景: 公交汽车售票员对车厢里的所有人和大件行李进行遍历, 让大家买票.
迭代器模式 Iterator
迭代器模式(Iterator), 提供一种方法顺序访问一个聚合对象中各个元素, 而又不暴露该对象的内部表示.
当你需要访问一个聚集对象, 而且不管这些对象是什么都需要遍历的时候, 另外, 你需要对聚集对象有多种方式遍历时, 就应该考虑用迭代器模式.
迭代器模式为遍历不同的聚集结构提供如开始, 下一个, 是否结束, 当前哪一项等统一的接口.
很多高级编程语言已经吧这个模式做在语言中了.
第21章 有些类也需要计划生育 -- 单例模式
程序实例: 窗体程序, 希望工具箱窗体只出现一次.
简单解决方案1: 声明全局变量, 判断null.
缺点: 多个使用的地方会出现重复的判断代码. -& 把它们提炼到同一个地方.
改进: 由类自己控制实例化及判断.
构造函数私有.
静态获取方法, 创建和访问唯一实例.
单例模式 Singleton
单例模式(Singleton), 保证一个类仅有一个实例, 并提供一个访问它的全局访问点.
多线程时的单例: lock加锁.
性能进一步改良: 双重锁定(Double-Check Locking).
静态初始化: sealed阻止派生; 变量标记为readonly.
第22章 手机软件何时统一 -- 桥接模式
场景: 不同手机品牌和不同的应用软件如何设计类.
两种复杂并且不合理的设计:
手机品牌抽象类 &- 手机品牌具体类 &- 手机品牌下的各种应用类.
手机软件抽象类 &- 手机软件具体类 &- 不同品牌版本的具体应用类.
用继承的缺点:
对象的继承关系是在编译时就定义好了, 所以无法在运行时改变从父类继承的实现.
子类的实现与父类有非常紧密的依赖关系, 以至于父类实现中的任何变化必然会导致子类发生变化.
当你需要复用子类时, 如果继承下来的实现不适合解决新的问题, 则父类必须重写或被其他更适合的类替换.
继承这种依赖关系限制了灵活性并最终限制了复用性.
(不要拿着锤子看所有东西都成了钉子.)
一定要在是'is-a'的关系时再考虑使用继承.
合成/聚合复用原则
合成/聚合复用原则(CARP), 尽量使用合成/聚合, 尽量不要使用类继承.
合成(Composition, 也有翻译成组合)和聚合(Aggregation)都是关联的特殊种类.
合成则是一种强的'拥有'关系, 体现了严格的部分和整体的关系, 部分和整体的生命周期一样.
聚合表示一种弱的'拥有'关系, 体现的是A对象可以包含B对象, 但B对象不是A对象的一部分.
例子: 大雁和翅膀是合成关系; 大雁和雁群是聚合关系.
改进后的松耦合例子程序:
手机品牌类 &- 具体手机品牌类.
手机软件类 &- 具体软件类.
手机品牌抽象类包含手机软件抽象类对象.
改进后增加软件和手机品牌都只需要增加新的类 -& 开放-封闭原则.
桥接模式 Bridge
桥接模式(Bridge), 将抽象部分与它的实现部分分离, 使它们都可以独立地变化.
这里的实现指的是抽象类和它的派生类用来实现自己的对象.
解释: 实现系统可能有多角度分类, 每一种分类都有可能变化, 那么就把这种多角度分离出来让它们独立变化, 减少它们之间的耦合.
第23章 烤羊肉串引来的思考 -- 命令模式
场景: 烤肉摊: 烤串人和客户之间紧密耦合, 比较混乱; 烤肉店: 由服务员记录客户请求并记录, 再通知烤肉师傅, 利于管理, 支持撤销.
松耦合设计: 定义抽象命令类, 其中包含烤肉师傅; 具体命令类中烤肉师傅执行具体行为; 服务员类包含命令对象, 通知方法通知命令执行.
进一步扩展: 在服务员类中: 增加盛放命令的容器; 对不合理命令进行回绝判断; 记录日志和取消订单; 遍历命令通知执行.
命令模式 Command
命令模式(Command), 将一个请求封装为一个对象, 从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志, 以及支持可撤销的操作.
命令模式的作用:
能较容易地设计一个命令队列.
可以较容易地将命令记入日志.
允许接收请求的一方决定是否要否决请求.
可以容易地实现对请求的撤销和重做.
由于新加的具体命令类不影响其他类, 因此新加具体命令类很容易.
把请求一个操作的对象与知道怎么执行一个操作的对象分割开.
第24章 加薪非要老总批? -- 职责链模式
背景: 小菜要求加薪, 向经理提出, 经理向总监提出, 总监向总经理提出.
程序: 申请处理程序, 申请(包含类别, 内容, 数量)提交给管理者, 每个管理者根据申请细节决定自己是否能够处理(比较长的方法, 多条分支).
职责链模式 Chain of Responsibility
职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求, 从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有一个对象处理它为止.
当客户提交一个请求时, 请求是沿链传递直至有一个ConcreteHandler对象负责处理它.
接收者和发送者都没有对方的明确信息, 且链中的对象自己也并不知道链的结构. 结果是职责链可简化对象的相互连接, 它们仅需保持一个指向其后继者的引用, 而不需保持它所有的候选接受者的引用.
第25章 世界需要和平 -- 中介者模式
中介者模式又叫调停者模式.
举例: 联合国组织.
'迪米特法则', 如果两个类不必彼此直接通信, 那么这两个类就不应当发生直接的相互作用. 如果其中一个类需要调用另一个类的某一个方法的话, 可以通过第三者转发这个调用.
通过中介者对象, 可以将系统的网状结构变成以中介者为中心的星形结构, 每个具体对象不再通过直接的联系与另一个对象发生相互作用, 而是通过'中介者'对象与另一个对象发生相互作用.
之前'迪米特'法则的例子: 公司的IT部门管理, 由主管来协调工作.
中介者模式 Mediator
中介者模式(Mediator), 用一个中介对象来封装一系列的对象交互. 中介者使各对象不需要显式地相互引用, 从而使其耦合松散, 而且可以独立地改变它们之间的交互.
程序例子1: 不同的同事类之间通过中介者对象来通信.
程序例子2: 国家之间通过联合国安理会通信.
中介者模式优点:
Mediator的出现减少了各个Colleague的耦合, 使得可以独立改变和复用各个类.
把对象协作进行了抽象, 将中介作为一个独立的概念并将其封装在一个对象中, 这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来, 也就是站在一个更宏观的角度去看待系统.
中介者模式的缺点:
具体中介类可能会变得非常复杂, 不容易维护.
中介者模式例子: Windows程序中的Form或Web网站程序的aspx.
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合, 以及想定制一个分布在多个类中的行为, 而又不想生成太多的子类的场合.
第26章 项目多也别傻做 -- 享元模式
背景: 小菜接了多个小型外包项目, 给私营业主做网站. 多个网站要求类似, 形式有一些变化.
问题: 真的需要每个网站都分别有一份代码, 每个网站租用一个虚拟空间吗?
它们本质上是一样的代码, 如果网站增多, 实例增多, 对服务器的资源浪费严重.
共享代码: 大型的博客网站, 电子商务网站, 里面的每一个博客或商家也可以理解为一个小的网站. -& 利用用户ID来区分不同的用户, 具体数据和模板可以不同, 但代码核心和数据库却是共享的. -& 节省服务器资源; 代码维护和扩展都更容易.
享元模式 Flyweight
享元模式(Flyweight), 运用共享技术有效地支持大量细粒度的对象.
FlyweightFactory: 创建并管理Flyweight对象. 它主要用来确保合理地共享Flyweight, 当用户请求一个Flyweight时, FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话).
Flyweight: 所有具体享元类的超类或接口, 通过这个接口, Flyweight可以接受并作用于外部状态. 其子类并不强制共享.
网站共享代码: 同样类型的网站使用同一个实例, 减少实例个数.
问题: 网站的数据不同? -& 外部状态.
内部状态与外部状态
内部状态: 在享元对象内部并且不会随环境改变而改变的共享部分.
外部状态: 随环境改变而改变的, 不可以共享的状态.
享元模式可以避免大量非常相似类的开销. 在程序设计中, 有时需要生成大量细粒度的类实例来表示数据. 如果能发现这些实例除了几个参数外基本上都是相同的, 有时就能够大幅度地减少需要实例化的类的数量. 如果能把那些参数移到类实例的外面, 在方法调用时将它们传递进来, 就可以通过共享大幅度地减少单个实例的数目.
享元模式应用
如果一个应用程序使用了大量的对象, 而大量的这些对象造成了很大的存储开销.
对象的大多数状态可以是外部状态, 如果删除对象的外部状态, 那么可以用相对较少的共享对象取代很多组对象, 此时可以考虑使用享元模式.
应用: .Net中的string: 相同的字符串常量其实是共享内存的, 所以引用相同.
围棋, 五子棋, 跳棋等: 颜色是内部状态, 位置是外部状态.
第27章 其实你不懂老板的心 -- 解释器模式
背景: 从老板谈话中听出弦外之音.
解释器模式 Interpreter
解释器模式(Interpreter), 给定一个语言, 定义它的文法的一种表示, 并定义一个解释器, 这个解释器使用该表示来解释语言中的句子.
解释器模式需要解决的是, 如果一种特定类型的问题发生的频率足够高, 那么可能就值得将该问题的各个实例表述为一个简单语言中的句子. 这样就可以构建一个解释器, 该解释器通过解释这些句子来解决该问题.
匹配字符串 -& 正则表达式.
浏览器解释HTML文法, 显示网页.
机器人指令.
当有一个语言需要解释执行, 并且你可以将该语言中的句子表示为一个抽象语法树时, 可使用解释器模式.
好处: 可以很容易地改变和扩展文法, 因为该模式使用类来表示文法规则, 你可使用继承来改变或扩展该文法. 也比较容易实现文法, 因为定义抽象语法树中各个节点的类的实现大体类似, 这些类都易于直接编写.
不足: 解释器模式为文法中的每一条规则至少定义了一个类, 因此包含许多规则的文法可能难以维护和管理. 建议当文法非常复杂时, 使用其他的技术如语法分析程序或编译器生成器来处理.
程序实例: 音乐解释器.
第28章 男人和女人 -- 访问者模式
背景: 写一个程序, 输出男人和女人在相同状态下的不同反应, 比如: 男人成功时 女人成功时yyy.
人分为男人和女人两类, 这个分类是稳定的. 所以可以在抽象的状态类中, 声明男人反应和女人反应两个方法. 这样方法个数是稳定的, 不会很容易地发生变化.
而人的抽象类中有一个抽象方法接受状态对象.
客户程序中将具体程序作为参数传递给具体的人的类. (第一次分派.)
具体的男人或女人的类在接受方法中调用状态对象中对应自己的那个方法, 并将自己作为参数传递进去. (第二次分派.)
访问者模式 Visitor
访问者模式(Visitor), 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.
访问者模式适用于数据结构相对稳定的系统. 它把数据结构和作用于结构上的操作之间的耦合解脱开, 使得操作集合可以相对自由地演化.
访问者模式的优点就是增加新的操作很容易, 因为增加新的操作就意味着增加一个新的访问者. 访问者模式将有关的行为集中到一个访问者对象中.
访问者模式的缺点是使增加新的数据结构变得困难了.
阅读(...) 评论()