适配器模式(Adapter Pattern)

模式动机

适配器模式(AdapterPattern)是一种使用频率非常高的结构型模式,如果在系统中存在不兼容的接口,可以通过引入一个适配器来使得原本因为接口不兼容而不能一起工作的两个类可以协同工作。适配器模式中适配器的作用与现实生活中存在的电源适配器、网络适配器等作用相同。在引入适配器后,无需对原有系统进行任何修改,且更换适配器或者增加新的适配器都非常方便,系统具有较好的灵活性和扩展性。适配器模式可看做是一种对现有系统进行补救以及对现有类进行重用的模式

  • 通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。

如现在目标类中定义的方法名为method1( ),客户端已经针对该方法进行编程,而现有类中的方法method2( )恰好满足客户端的要求,如何在不修改原有目标类和客户端代码的基础上确保能够使用到现有类中的method2( )方法,就是适配器模式所要解决的问题


也就是说,当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作,这就是适配器模式的模式动机。

模式定义

  • 适配器模式也称为包装器(Wrapper)模式。
  • 适配器模式(AdapterPattern):将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。
  • 它既可以作为类结构型模式,也可以作为对象结构型模式。
  • 在适配器模式的定义中所提及的接口是指广义的接口,它可以表示成一个方法或者方法的集合。

模式结构


类适配器

image

对象适配器

image


模式分析

  • 适配器模式可以将一个类的接口和另一个类的接口匹配起来,使用的前提是不能或不想修改原来的适配者接口和抽象目标类接口。如向第三方购买了一些类、控件,如果没有源代码,这时使用适配器模式可以统一对象访问接口。
  • 适配器模式更多的是强调对代码的组织,而不是功能的实现。
  • 类适配器模式违背了合成复用原则。类适配器是客户类有一个接口规范的情况下可用,反之不可用。
  • 适配者类无法继承时,只能用对象适配器。

  • 模式优点
    • 将目标类和适配者类解耦
    • 增加了类的透明性和复用性,提高了适配者的复用性
    • 灵活性和扩展性非常好,更换(增加)适配器,符合开闭原则。
    • 类适配器模式:由于继承关系,置换一些适配者的方法很方便
    • 对象适配器模式:可以把多个不同的适配者适配到同一个目标,还可以适配一个适配者的子类
  • 模式缺点
    • 类适配器模式
      (1) 一次最多只能适配一个适配者类,不能同时适配多个适配者
      (2) 适配者类不能为最终类(final)
      (3) 目标抽象类只能为接口,不能为类
    • 对象适配器模式
      在适配器中置换适配者类的某些方法比较麻烦
  • 使用情形
    • 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
    • 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作

本文来自博客园,作者:街酒,转载请注明原文链接:http://www.cnblogs.com/sorrymine/p/17393982.html

本文转载于网络 如有侵权请联系删除

相关文章

  • Oracle学习(六):子查询

    1.知识点:可以对照下面的录屏进行阅读SQL>--子查询所要解决的问题:问题不能一步求解 SQL>--查询工资比SCOTT高的员工信息 SQL>--(1)使用普通方法 SQL>--1.SCOTT的工资 SQL>selectsalfromempwhereename='SCOTT'; SQL>--2.查询比3000高的员工 SQL>select* 2fromemp 3wheresal>3000; SQL>--(2)使用子查询 SQL>select* 2fromemp 3wheresal>(selectsal 4fromemp 5whereename='SCOTT'); SQL>--注意的问题: SQL>--1.将子查询放入括号中 SQL>--2.采用合理的书写风格 SQL>--3.可以在主查询的where,select,from,having后面,放置子查询 SQL>--4.不可以在groupby后面放置子查询 SQL>--5.强调from后面放置

  • maven私库

    <?xmlversion="1.0"encoding="UTF-8"?> <!-- LicensedtotheApacheSoftwareFoundation(ASF)underone ormorecontributorlicenseagreements.SeetheNOTICEfile distributedwiththisworkforadditionalinformation regardingcopyrightownership.TheASFlicensesthisfile toyouundertheApacheLicense,Version2.0(the "License");youmaynotusethisfileexceptincompliance withtheLicense.YoumayobtainacopyoftheLicenseat http://www.apache.org/licenses/LICENSE-2.0 Unlessrequiredbyapplicablelawora

  • 人工智能的最后一英里问题

    1.从错误到正确(或更好)的互动要求人工智能系统100%地提供正确答案是不可能的,无论是在数学上还是在实践中。因此,我们最好的目标是通过合理的投资来获得足够正确的答案。为了做到这一点,我建议探索以下几点:「确定80–20AI救援计划」。80-20是一个众所周知的概念和商业公理;它强调了一个普遍的观察结论,即20%的工作导致80%的结果。使用80-20的心态来简化解决方案是至关重要的;这样做有助于避免启动错误的人工智能系统和损害客户体验(杰西的例子)。显然,当人工智能系统提供不合理的建议时,某些技术性的东西就被打破了。过于复杂的设计是一个常见的问题。一组数据科学家可以问:1)要达到80%的准确率,最简单的设计是什么?2)结果是否足够好以实现承诺的商业价值?3)有哪些更先进的技术可以捕捉到接下来的2%、5%和10%?尽管对复杂的人工智能技术(如深度学习和强化学习)大肆宣传,但并不是所有人都需要在第一天就使用它们。简单的数据挖掘技术,如关联规则,可能能够捕获大部分客户动态,并在早期提供足够好的结果。「应用商业规则来保护」。由于机器学习模型肯定会有错误,因此对于质量保证来说,增加一层业务规则是

  • Audio ABC | CD为何是44.1KHz采样率?

    旧文排版重发,略作修改。小朋友英语学习的培训教材中附送了一张音频CD,作者在鼓捣这张CD的时候,忽然一个问题冒了出来:为什么CD采用了44.1KHz的采样率?为什么不是48KHz?毕竟48这个数字看起来整齐的多。为此作者做了一番搜索和研究,分享给感兴趣的朋友。声音的基本概念首先介绍一些常见的音频概念。大家知道人耳能听到声音,是因为声音在音源处产生后,对空气产生了一系列忽强忽弱的压力,这种压力的变化(振动)可以被人耳内部的耳膜感受到,然后经由各种神经细胞,汇总到大脑中形成声音的感觉。有时候这种压力比想象的要大的多,它不仅可以驱动薄薄的耳膜,当强度足够大时,甚至可以吹动人的头发和衣服。参加过室外音乐节的朋友,如果碰巧在现场比较靠近喇叭的地方,应该有切身的体会。人耳能听到的这种压力振动的范围大概在20Hz到20KHz,Hz即赫兹,即每秒钟振动发生的次数。除了耳道,身体的其它一些部分也可以感受到声音的振动,例如骨传导耳机就是绕过了耳膜,利用头部骨骼来传递声音的振动。(骨传导原理。图片来自网络)音频信号的采样因为声音本质上是一个连续的模拟信号,当声音被记录下来,尤其是数字化记录时,就涉及到采样率

  • 学AI哪家强?2019全球排行清华第1,北大第2

    导读:2019年过去了,21世纪10年代也过去了。马萨诸塞大学计算机与信息科学学院教授EmeryBerger发布的CSRanking项目,是全球院校计算机科学领域实力的排名,现在数据已更新到2020年。在2019年计算机科学综合排行榜上,CMU最终排名第1,清华第2。而在AI分项排行中,清华以绝对优势霸榜,北大也超越CMU排在第2。加上排名第4的中科院,前5名中有3所中国高校。作者:数据叔如需转载请联系大数据DT(ID:hzdashuju)01AI榜:2019清华全球第1,北大第2全球高校AI排行榜上,清华大学以绝对优势排名第1,AI领域论文发文数量和人数都遥遥领先排在第2的卡内基·梅隆大学。与2018年相比,北京大学超越卡内基·梅隆上升到第2。中国高校持续表现强势,前5名中有3所,前10名中有5所。▲2019年全球高校AI排名(前10)2019年有更多中国高校的数据被CSRanking采集,相比于2018年,复旦大学、武汉大学、深圳大学等在2019年成为全球榜单中的新面孔。以下是全球AI榜单中,部分中国高校的排名情况。02计算机科学综合榜:2019年CMU第1,清华第22019年,卡

  • MySQL性能优化之骨灰级,高阶神技

    一、前言 MySQL调优对于很多程序员而言,都是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰。在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。今天给大家讲解MySQL的优化实战,助你高薪之路顺畅!图-MySQL查询过程二、优化的哲学注意:优化有风险,涉足需谨慎!2.1、优化可能带来的问题1、优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统。2、优化手段本来就有很大的风险,只不过你没能力意识到和预见到!3、任何的技术可以解决一个问题,但必然存在带来一个问题的风险!4、对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果。5、保持现状或出现更差的情况都是失败!2.2、优化的需求1、稳定性和业务可持续性,通常比性能更重要!2、优化不可避免涉及到变更,变更就有风险!3、优化使性能变好,维持和变差是等概率事件!4、切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化!5、所以优化工作,是由业务需要驱使的!!

  • dotnet 代码调试方法

    课前测试断点调试异常调试多线程调试无断点调试库调试模拟调试文件读写调试界面调试DUMP调试性能调试经验本文将会从简单到高级,告诉大家如何调试dotnet的代码,特别是桌面端。本文将会使用到VisualStudio大量的功能,通过各种好用的功能提高调试方法在本文开始将会告诉大家一些套路,也就是遇到什么问题怎么调试,然后将会告诉大家在面对一些棘手问题,例如遇到我不熟悉的代码如何调试,遇到库里面的代码出问题如何调试除了调试问题之外,本文还包括性能调试,有小伙伴说卡,那么卡在哪,如何找到卡的代码。有小伙伴说占用内存,那么占用内存的代码是什么?对于客户端还包括渲染方面调试,我觉得我软件显示比较慢,那么是渲染卡还是主线程卡欢迎小伙伴告诉我一些你的调试方法课前测试带着问题阅读效果将会更好如何看待断点调试断点调试应该优先考虑,只要代码能做断点调试的优先进行断点调试断点调试是其他手段的一个辅助,在大多数调试方法里面都用到断点调试在断点调试过程可以了解当前上下文变量状态,以及代码执行逻辑,甚至更改变量值更改执行顺序在断点调试库或框架中最重要的是符号文件,可以通过dotPeek反编译生成断点调试一定需要符号

  • CentOS6.5安装mysql5.1.73

    思路:1、查看有无安装过mysqlrpm-qa|grepmysql复制或yumlistinstalledmysql复制2、查看有无安装包yumlistmysql*复制3、安装mysql服务端yuminstallmysql-server yuminstallmysql-devel复制4、启动&&停止  a、设置数据库默认字符    在mysql配置文件/etc/my.cnf中加入default-character-set=utf8vim/etc/my.cnf复制  b、设置开机自启动chkconfigmysqldon chkconfig--listmysqld复制  c、启动mysqlservicemysqldstart复制5、登录  a、创建root管理员mysqladmin-urootpassword123456复制  b、忘记密码servicemysqldstop mysqld_safe--user=root--skip-grant-tables mysql-uroot usemysql updateusersetpassword=password("ne

  • 如何把传统写法改成框架形式 es6http://www.expressjs.com.cn/

    每天思考的问题: 1.什么是组件 2.什么是插件 3.如何把传统写法改成框架形式 4.前端为什么要使用框架,使用框架的好处是什么?Image.pnghttp://www.zhihu.com/question/20888075http://cn.vuejs.org/guide/components.html#u4EC0_u4E48_u662F_u7EC4_u4EF6_uFF1Fhttps://coding.net/阿里的服务器: https://ecs-buy.aliyun.com/#/prepayhttps://ecs-buy.aliyun.com/#/prepayhttps://www.aliyun.com/price/product/?spm=5176.ecsPrepay.instance.1.tq3O0R#/ecs/calculatorImage.png怎么样判断上次已经有了就不需要绑定了,只需要数据就行Image.png事先准备一个对象,为空判断是否存在;存在,修改数据,不存在,在创建一个。app第一次声明后,第二次就不需要声明,在外面声明的,是全局变量。Image.png删除

  • 微博取消140字“贴吧化”,为什么要做内容大杂烩?

    最近,几个明星产品的升级很有意思:微博不限字数了,140字这个最重要的标签竟然被干掉了;今日头条悄然公测头条问答对标知乎,还推出了图集、视频等功能;知乎在去年也发布了“读读日报”。这些应用所做的事情越来越一致:都在成为UGC(用户生产内容)的多元化内容平台。今日头条不再只是资讯客户端,知乎不再只是问答平台,微博不再是140字短消息公共发布平台。综观国内UGC平台,除了上述选手之外,还有一直深耕UGC内容的百度贴吧、微信公众平台,以及豌豆荚去年推出的“一览”、网易正在低调发力的网易热。为什么大家都做成了内容消费平台?一年前,人们很难将贴吧、微博、今日头条这些平台联系在一起。现在它们却越来越相似:都是基于UGC模式的平台,支持图文、视频、投票、点赞等多种形式的内容和互动形式,所涵盖内容性质也是越来越全面,不再专注于某一类内容:今日头条不甘于只做资讯,做了问答、支持发布图集、视频,越来越多兴趣类内容如星座、美女;微博取消140字限制不再专注于轻量级内容,意味着其与微信公众平台更像了,都支持长图文,都是基于follow关系的内容流,内容变现都是靠广告和打赏。一个显著趋势是所有UGC平台都在将内

  • 选择云服务提供商,你不知道的五个审查维度

    英迈国际云公司的JasonBystrak提到,选择潜在的云服务提供商合作伙伴,不应该只考虑客户偏好。计算机技术工业协会关于云计算趋势的2014年度报告表明,在选择云服务提供商时,解决方案提供商将客户偏好,放在审查云服务提供商标准列表的第一位。只有11%受访的解决方案提供商认为客户偏好不重要,可见,客户偏好具有很大的影响。但是,到底应不应该考虑客户偏好?客户偏好是很重要,但是,除了客户偏好之外,还要考虑服务提供商合作伙伴的财务状况是否良好,其技术是否最适合你的客户等等。你要对所有潜在的云合作伙伴进行适当的审查,这样,一旦提供商提供的支持不符合要求、提供的技术言过其实的话,你就不会因此苦恼。当然,有些提供商在你签完合同后,过几个月可能就面临破产,如果你想要避开这样的提供商,更要进行适当的审查。审查云服务提供商,以下是值得注意的五个方面:是否适合解决方案与你的业务适合吗?你必须具备营销、技术和操作技能、还要有相应的资源,来支持技术——或者你具备获得这些技能和资源的渠道。除此之外,还要考虑这项技术是否能够满足你的客户群需求?解决方案提供商比任何人都清楚客户的需求,因此,你是最有资格做出判断的人

  • 如何避免设计出“烦人”的登录和注册页面

    往往当用户想要在某一个网站或APP上登录或注册一个账号时,登录和注册页面就显得尤为重要。登录或者注册表单是网页和APP设计中最重要的元素之一,所以在设计网站和APP的时候,表单的设计需要慎重考虑。好的登录/注册表单可以鼓励用户成为注册者,订阅者甚至成为你的常驻业务客户。一个拥有干净的外观,优质的创意以及视觉吸引人的表单必定会提高访客的转化率。设计一个有效和干净的登录/注册表单要求设计师具有丰富的创造力和经验,以下几个小技巧希望可以帮助大家。小贴士:以下是几款表单设计常用的原型工具供大家参考:网页: Axure, Mockplus, UXPin。APP: Justinmind, Proto.io, Invision。将“注册”和“登录”分开大多数情况下,我们看到“注册”和“登录”按钮位于彼此靠近的位置,但这可能对用户产生反向影响。两个动作都包含相同的动词,并且看起来相似,所以他们可能会混淆用户选择错误的选项。使用户感到沮丧,离开应用程序。基本上,嵌入在应用界面中的元素不应该让用户暂停和思考。可以使用不同的动词或简要说明每个字段是什么来帮助用户更好的理解。提供明确的引导提示当用户输入错误时

  • JavaScript中splice方法的使用「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。JavaScript中splice方法的使用splice的基本用法删除操作插入操作替换操作splice一次性删除多个元素splice的基本用法在JavaScript中,arrObject.splice()方法是处理数组的利器,利用它可以实现在指定位置删除、替换、插入指定数量的元素。 其语法为:arrayObject.splice(index,howmany,item1,…,itemX) 含义为从index开始,删除howmanry个元素,并在原地插入item1,…,itemN,最后返回被删除的数组。删除操作letmyArray=["html","css","javascript","jQuery"]; letmyDel=myArray.splice(1,1);//从索引1开始删除1个元素 console.log(myArray)//['html','javascript','jQuery']; console

  • Git 撤销提交的commit

    撤销提交的commit 注: mixed相当于代码保留,撤销gitcommit,同时撤销gitadd,代码回到未暂存区 soft相当于代码保留,撤销gitcommit,不撤销gitadd,代码回到暂存区,在idea编辑器和mixed是一样的 hard不保留代码,撤销gitcommit,同时撤销gitadd,回到了上一次commit的状态,并且相当于revert一次 撤销上两次的commit:HEAD~2或者HEAD^^,如此类推三次四次 等价于git的命令:gitreset--mixedHEAD~2或gitreset--mixedcommit版本号 Ihaveadream:SandybeachB-J-N.

  • 目标检测之YOLO算法:YOLOv1,YOLOv2,YOLOv3,TinyYOLO,YOLOv4,YOLOv5,YOLObile,YOLOF,YOLOX详解(转)

    YOLO官网: https://github.com/pjreddie/darknet​github.com/pjreddie/darknet YOLOv.sFasterR-CNN: 1.统一网络:YOLO没有显示求取regionproposal的过程。FasterR-CNN中尽管RPN与fastrcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fastrcnn网络.相对于R-CNN系列的"看两眼"(候选框提取与分类),YOLO只需要LookOnce. 2.YOLO统一为一个回归问题,而R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即boundingbox(回归问题)。 2.YOLOv1:YouOnlyLookOnce:Unified,Real-TimeObjectDetection 目标检测之YOLOv1算法:YouOnlyLookOnce:Unified,Real-TimeObjectDetection: 初识CV:YOLOv1:YouOnlyLookOnce:Unified,Real-TimeObjectDetection56赞同·16评论文章

  • Android Annotation ——XArch

      注解并不是第一次看到,类似于见过最多的@Override  【遇】   BaseActivity中实现了IGetPageName接口,接口中定义了getPageName方法,添加@PageName注解,MainActivity中重写BaseActivity中的getPageName方法并设置返回值,这里达到了返回值只能设置为PageName枚举中值的效果,而枚举使用静态常量+@StringDef的方法定义。 @PageName自定义注解,@StringDef(androidx.annotation包内) BaseActivity.java IGetPageName.java PageName.java    MainActivity.java   【问】 注解是什么,注解有什么作用? 在什么情况下会想到要使用注解?   【知】 参考博文:JavaAnnotation认知(包括框架图、详细介绍、示例说明)-如果天空不死-博客园(cnblogs.com) 1、JavaAnnotation是JDK5.0引入的一种注释机制 2、我对于

  • 【题解】Function HDU 6823 2020杭电多校5 线性基 抽象代数

    题意 给你\(n\)个在\([0,2^{60})\)的数字\(a_1,...,a_n\),首先用这些数字构造一个线性基,设这个线性基是群\(G\) 然后构造一个映射\(f:G\toG\),满足题目中写的三个条件 这个题有两个subtask subtask1是,让你构造出这样的一个映射\(f\),如果不存在输出无解,否则,他会告诉你一些\(x\),你要告诉他对应的\(f(x)\),通过这样的方法检验正确性 subtaks2是,给你一个映射\(f\),还有一些\(x\)和对应的\(f(x)\),问你这组解是否合法 (这题的spj也就是subtask2是比subtask1难的,感受到了出题人的恶意233333) 题解 需要一些抽代基础,怪不得高中爷爷们不会这个题2333333 首先存在一个集合\(S\),\(S\)中所有元素的image是\(0\),这个\(S\)称为\(G\)的Kernal,记为\(K\) 首先,\(K\)一定是\(G\)的subgroup 然后,Lagrange定理告诉我们,\(K\)的阶整除\(G\)的阶 显然,\(K\)一定是从线性基中选若干个线性无关组,由这些向量张

  • Orleans介绍

    一、介绍 Orleans是一个框架,提供了一个直接的方法来构建分布式高规模计算应用程序 默认可扩展-》Orleans处理构建分布式系统的复杂性,使您的应用程序能够扩展到数百台服务器。低延迟 -》 Orleans允许你在内存中保持你需要的状态,所以你的应用程序可以快速响应传入的请求。简化的并发性 -》 Orleans允许你编写简单的单线程C#代码,处理异步消息在对象(Grains)之间传递的并发性。 在Orleans,Grains是应用程序代码的基石。Grains是实现一致性接口的.net类的实例。接口的异步方法用于指示Grains可以执行哪些操作 publicinterfaceIMyGrain:IGrainWithStringKey { Task<string>SayHello(stringname); }复制 这个实现是在Orleans框架内执行的: publicclassMyGrain:IMyGrain { publicTask<string>SayHello(stringname) { returnTask.FromResult($"He

  • 启明云端分享:7寸串口屏在油烟机上的标新立异

    根据2021年的家电调查报告,90后群体占比最大。以油烟机为例,年轻消费者对油烟机的需求,不再局限于抽油烟,自动清洁、自动巡航、智能联控、查看菜谱等硬性功能,而是更加关注产品的新颖度与实用性。 下图某品牌的油烟机,就应用了启明云端7寸的彩屏方案。简约大气,不仅能边做菜,还能随时查看菜谱,做饭无聊,还可以手机来个投屏,做饭之余再追个剧。     接下来小编为大家介绍一下用SigmaStarSSD202D方案做的7寸串口屏 7寸串口屏方案是基于SigmaStarSSD202D(ARMCortexA7内核)主频高达1.2GHz,分辨率为1024x600的7寸IPS电容触摸屏幕,开机速度非常快,两秒显示logo,7秒进入桌面;支持openwrt系统(同时也支持LINUX系统),用户可以使用8ms平台适配的lvgl库进行拖拽式gui开发;支持串口屏开发模式;内容显示支持图片、GIF,视频。串口屏上带WIFI、蓝牙模块,CAT.1,支持TF卡、一路网口,一路USB口,一路左右声道扬声器,RTC电路,一路RS232一路RS485,你还可以选配投屏方案,让用户可快速方便的进行手机投

  • centos 安装最新稳定版本docker

    直接yum安装的docker版本是: docker--versionDockerversion1.12.6,build85d7426/1.12.6 一些新特性需要安装最新的稳定版本 国内可以用镜像加速,可以参考我的另外一篇blog http://www.cnblogs.com/zhishuai/p/8013137.html 以下流程主要整理自docker中国官方站,简单梳理下流程 https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/ 获取适用于CentOS的DockerCE 预计阅读时间:3分钟 如需开始在CentOS上使用DockerCE,请确保您满足先决条件,然后再安装Docker。 先决条件 DockerEE客户 如需安装Docker企业版(DockerEE),请转至获取适用于CentOS的DockerEE而不是本主题。 如需了解有关DockerEE的更多信息,请参阅Docker企业版。 操作系统要求 如需安装DockerCE,您需要64位版本的CentOS7。 卸载旧版本 Docker的早期

  • python基础查漏补缺7--八皇后问题

    #-*-coding=utf-8-*- ''' @Desc:八皇后算法,python实现 @Date:2017-10-13 @Author:HenryWang ''' importrandom #八皇后问题的前情不在此重复说明 #验证新的皇后是否和之前的皇后所在位置有冲突:在同一列或者在对角线上 #state为已经确定的皇后的位置元组 #nextX为新的一个皇后的所在列的位置 defconflict(state,nextX): nextY=len(state)#新的皇后所在行 foriinrange(len(state)):#针对之前所有的皇后来判断 #state[i]为第i行的皇后的所在列的位置 #如果state[i]-nextX==0,那么新的皇后和所对比的皇后在同一列,返回对比结果为True #如果abs(state[i]-nextX)==nextY-i,那么新的皇后和所对比的皇后在对角线上,返回对比结果为True ifabs(state[i]-nextX)in(0,nextY-i): returnTrue #如果新的皇后和所有历史皇后都不在同一列或者对角线上,返回对比记过为f

相关推荐

推荐阅读