外观模式(Facade Pattern)

一、模式动机

外观模式(Facade Pattern)是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端和子系统之间的操作为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。
外观模式中,外部与一个子系统的通信可以通过一个统一的外观对象进行。外观模式又称为“门面模式”。也是对象结构型模式之一。

  • 一个客户类需要和多个业务类交互,有时候这些需要交互的业务类会作为一个整体出现
  • 引入一个新的外观类(Facade)来负责和多个业务类【子系统(Subsystem)】进行交互,而客户类只需与外观类交互
  • 为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互
    • 没有外观类:每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大
    • 引入外观类:客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度功能
      image

二、模式定义

  • 外观模式(Facade Pattern):外部与子系统的通信通过一个统一的外观对象进行,为子系统中的一组接口提供一个统一的入口
  • 外观模式定义了一个高层接口,这个接口使得子系统更加容易使用
  • 外观模式又称为门面模式,它是一种对象结构型模式

三、模式结构

image

四、案例实现

案例背景

电源开关,可以控制电灯,风扇,空调和电视机的关闭

案例结构

image

代码实现

public class Light {

    private String position;

    public Light(String position) {
        this.position = position;
    }

    public void on(){
        System.out.println(this.position+"开灯");
    }
    public void off(){
        System.out.println(this.position+"关灯");
    }
}

电视

public class Television {

    public void on(){
        System.out.println("开电视");
    }
    public void off(){
        System.out.println("关电视");
    }

}

空调

public class AirConditioner {

    public void on(){
        System.out.println("开空调");
    }
    public void off(){
        System.out.println("关空调");
    }

}

风扇

public class Fan {

    public void on(){
        System.out.println("开风扇");
    }
    public void off(){
        System.out.println("关风扇");
    }

}

开关

public class SwitchFacade {

    private Light lights[] = new Light[4];
    private Fan fan;
    private AirConditioner airConditioner;
    private Television television;

    public SwitchFacade() {

        lights[0] = new Light("左前");
        lights[1] = new Light("左后");
        lights[2] = new Light("右前");
        lights[3] = new Light("右后");

        fan = new Fan();
        airConditioner = new AirConditioner();
        television = new Television();
    }

    public void on(){
        lights[0].on();
        lights[1].on();
        lights[2].on();
        lights[3].on();
        fan.on();
        airConditioner.on();
        television.on();
    }

    public void off(){
        lights[0].off();
        lights[1].off();
        lights[2].off();
        lights[3].off();
        fan.off();
        airConditioner.off();
        television.off();
    }
}

客户测试类

public class Client {

    public static void main(String[] args) {
        SwitchFacade switchFacade = new SwitchFacade();
        switchFacade.on();
        System.out.println("-------------------------------");
        switchFacade.off();
    }

}

运行结果

image

案例分析

开关类中关联子系统类,开关类中的方法是调用子系统的方法,如果要增加新的子系统,需要引进抽象外观类

五、模式分析

  • 是迪米特法则的一种具体实现
  • 通过引入一个新的外观角色来降低原有系统的复杂度,同时降低客户类与子系统的耦合度
  • 所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统

六、总结

模式优点

  • 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
  • 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
  • 一个子系统的修改对其他子系统没有任何影响,而且子系统的内部变化也不会影响到外观对象

模式缺点

  • 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性
  • 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则

使用情形

  • 要为访问一系列复杂的子系统提供一个简单入口
  • 客户端程序与多个子系统之间存在很大的依赖性
  • 层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而是通过外观类建立联系,降低层之间的耦合度

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

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

相关文章

  • 我对Stream 一无所知

    Stream(不是IOStream)有哪些方法?Stream提供了大量的方法进行聚集操作,这些方法既可以是“中间的”,也可以是“末端的”。中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的map()方法就是中间方法。中间方法的返回值是另外一个流。 末端方法:末端方法是对流的最终操作。当对某个Stream执行末端方法后,该流将会被“消耗”且不再可用。上面程序中的sum()、count()、average()等方法都是末端方法。 除此之外,关于流的方法还有如下两个特征: 有状态的方法:这种方法会给流增加一些新的属性,比如元素的唯一性、元素的最大数量、保证元素以排序的方式被处理等。有状态的方法往往需要更大的性能开销。 短路方法:短路方法可以尽早结束对流的操作,不必检查所有的元素。 下面简单介绍一下Stream常用的中间方法:filter(Predicatepredicate):过滤Stream中所有不符合predicate的元素。 mapToXxx(ToXxxFunctionmapper):使用ToXxxFunction对流中的元素执行一对一的转换,该方法返回的新流中

  • 用FreeSWITCH进行图像处理

    在Mac上用Preview、Keynote、ImageMagick和FreeSWITCH进行图像处理现在处理图片的软件这么多,你可能奇怪为什么需要用到FreeSWITCH处理图像。是的,最流行也是最标准的图像处理工具当然是PhotoShop,PhotoShop如此流行,以至于它的缩写PS都成了图像处理的代名词。但是,PhotoShop唯一的缺点就是太贵,这些钱对于设计人员来说当然是值得花的,但对于广大程序员来说,它是个低频应用,可能一年中也用不了几次,就不合算。有时候实在需要,我也是使用GIMP凑合着用。GIMP是开源的,也能用,但说实话用起来确实不如PhotoShop顺手。当然,作为一名程序员,希望寻找另外的工具的动机就是,是否有比较轻量级的工具,是否能自动批量处理等。好了,言归正传,说说我为什么选了这么多工具来处理图像。请听题:我的需求是,将我写的毛笔字底色处理成透明的,将黑色替换成需要的颜色,做在书的封面上。原始图像如下图。当然这么折腾是有原因的,主要的原因是基本上所有好看的适合做封面的字体都是有版权的。 为了能在书中比较好的排版,在生成这幅图像时就使用了以下步骤和工具:使用iP

  • 求求你别再用System.out.println 了!!

    作者:雨尔辰辰来源:my.oschina.net/yuchener/blog/46585161、日志框架小张;开发一个大型系统:1、System.out.println("");将关键数据打印在控制台;去掉?写在一个文件?2、框架来记录系统的一些运行时信息;日志框架;zhanglogging.jar;3、高大上的几个功能?异步模式?自动归档?xxxx?zhanglogging-good.jar?4、将以前框架卸下来?换上新的框架,重新修改之前相关的API;zhanglogging-prefect.jar;5、JDBC---数据库驱动;写了一个统一的接口层;日志门面(日志的一个抽象层);logging-abstract.jar;给项目中导入具体的日志实现就行了;我们之前的日志框架都是实现的抽象层;「市面上的日志框架:」JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)SLF4j(SimpleLoggingFacadeforJava)

  • 通俗易懂专利分类、专利申请流程

    目录释义原则新颖性创造性实用性非显而易见性适度揭露性专利种类发明专利实用新型专利外观设计专利专利检索平台申请原则形式法定原则单一性原则先申请原则申请流程受理阶段初步审查阶段公布阶段实质审查阶段授权阶段受理机关申请文件申请途径职务发明释义一项发明创造的首创者所拥有的受保护的独享权益原则授予专利权的发明和实用新型,应当具备新颖性、创造性和实用性。新颖性新颖性,是指该发明或者实用新型不属于现有技术;也没有任何单位或者个人就同样的发明或者实用新型在申请日以前向国务院专利行政部门提出过申请,并记载在申请日以后公布的专利申请文件或者公告的专利文件中。创造性创造性,是指与现有技术相比,该发明具有突出的实质性特点和显著的进步,该实用新型具有实质性特点和进步。实用性判断要满足下列条件:专利法规定:“实用性,是指该发明或者实用新型能够制造或者使用,并且能够产生积极效果。”能够制造或者使用,是指发明创造能够在工农业及其它行业的生产中大量制造,并且应用在工农业生产上和人民生活中,同时产生积极效果。这里必须指出的是,专利法并不要求其发明或者实用新型在申请专利之前已经经过生产实践,而是分析和推断在工农业及其他行业

  • SaaS更要稳住

    来源:ToBeSaaS 作者 :戴珂  国内SaaS的又一春,来了?一天晚上,忽然收到好几条微信,内容是同一个:“知道吗?Salesforce市值已经超过Oracle,SaaS已经超越传统软件了。国内SaaS、特别是CRM赛道,机会很大啊!”。我统一回复道:这个结果应该在疫情初期就能料到。再说得神一点,三年前这个趋势就非常明显了,只是当时资本市场对SaaS这种收入模式不太买账。流行全球的疫情对Salesforce的帮助更大一些。如果单看疫情效应,股价增速比Salesforce更快的还有Zoom、DocuSign等远程办公SaaS。毕竟是实体不开工,业务功能就用不上。我其实真正想说的是:SaaS商业模式优越性已经无需证明,这种消息看看就好,淡定。什么SaaS黄金十年、CRM赛道爆发…,千万别激动,更别联想得太远。因为,先不要说跟Salesforce比;即使跟美国普通SaaS公司相比,差得都不止一个太平洋。SaaS生意的盈亏,凭什么?SaaS生意的盈亏,跟分类、赛道什么的没必然关系;主要跟收入模式有关。从收入模式上分,SaaS只有两种:订阅模式和混合模式。所谓订阅模式,就是SaaS原本的模

  • Eureka+SpringBoot2.X结合Security注册中心安全验证

    当我们直接配置完SpringCloudEureka的时候,任何人直接就可以访问,这样是极不安全的!!外网的情况下是绝对不允许的!好在有提供了解决方案,下面拿为我们提供的Security解决SpringCloud版本:<spring-cloud.version>Greenwich.SR4</spring-cloud.version>复制注册中心1、pom文件添加security坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency> 2、在application.yml文件中添加配置(properties一样,格式稍微变化);如果是集群的话,所有集群配置文件都要修改如下格式 spring:security:#开启安全验证user:name:root#用户名password:admin#密码 3、注册地址变

  • SAP UI5 StandardListItem和ObjectListItem的区别

    StandardListItem的用法:<mvc:ViewcontrollerName="sapcp.cf.tutorial.app.controller.View1"xmlns:mvc="sap.ui.core.mvc"displayBlock="true"xmlns="sap.m"> <Shellid="shell"> <Appid="app"> <pages> <Pageid="page"title="{i18n>title}"> <content> <Listitems="{/Products}"> <StandardListItemtype="Navigation"press="handleListItemPress&q

  • SAP SD 解除订单信贷冻结处理

    销售订单超出信贷额度后被冻结,不能再用于发货,需解除订单的信贷冻结才能继续执行相关业务。 事务代码:VKM4 路径:后勤-销售和分销-信用管理-销售和分销凭证-全部 操作步骤: 1.找到目录或输入事务代码进入主界面 2.选择/填写控制参数 说明:信贷账号即启用信贷控制的客户代码;单据分布中勾选销售凭证还是交货,依据客户的信贷“风险类别”而定。3.释放被冻结的订单 单据状态发生变化后,点击保存即可。 4.查看订单的信贷额度使用情况 在创建订单时,通过以上路径可查看客户的信贷信用情况。 在创建订单时,如果剩余的信贷额度(信贷限额-信贷风险总额)小于本订单的金额合计,则订单在保存时将依据风险类别予以警告或冻结订单/交货单;如果客户的风险类别为001-冻结订单,订单在保存后被信贷冻结,则被冻结订单的销售金额不计入信贷风险总额。 订单被信贷冻结以及被信贷管理员解除冻结,则其(信用状态)的值会发生变化,被冻结的订单状态为“不批准”,已释放冻结的订单状态为“核准的”,审批完成后即可创建后续的单据了。

  • 奶牛戴上VR眼镜“看片”,开心了可以多产奶:俄罗斯官方做了实验,拯救奶牛的冬季忧郁

    栗子发自凹非寺 量子位报道|公众号QbitAI冬天来了,奶牛忧郁了,没有心情产奶了。不是我说的,是俄罗斯有兽医专家说,他们国家的2,000万奶牛受到冬季忧郁(WinterBlues)的困扰,对产奶量也有影响。这可不行,毕竟俄罗斯许多地区一年到头是冬天,产奶量就没有保障了?于是,来自莫斯科的一群科学家脑洞喷发,做了史无前例的实验:他们给奶牛带上VR眼镜,播放了为奶牛定制的内容,结果发现它们的心情真的会变好。而前人的研究又多次表明,不止产奶量和心情有关,奶的质量也跟心情有关。如此说来,VR果然是充满希望的乳制品拯救计划。那么问题来了:到底看了什么“电影”?其实,这是莫斯科州农业和食品部开启的试点计划,听上去思路清奇,却是沿着科学道理走来的。官方发布的文章提到:奶牛对红色的感知更加强烈,相比之下,对绿色和蓝色系的感知要弱一些。(说好的色盲呢?)于是,科学家们就在VR眼镜里,模拟了夏日的田野,想用绿色的主色调让奶牛平静下来。虽然不知道奶牛最喜欢怎样的景色,但俄罗斯冬天长夏天短,给奶牛看夏天也是一种直观的思路。除此之外,奶牛戴的VR眼镜是从人类版改良来的,为它们的头部结构量身定制,方便奶牛舒适地

  • 【vivado约束学习二】 IO延时约束

    【vivado约束学习二】IO延时约束1I/O延迟约束介绍要在设计中精确建模外部时序,必须为输入和输出端口提供时序信息。XilinxVivado集成设计环境(IDE)仅在FPGA边界内识别时序,因此必须使用以下命令指定超出这些边界的延迟值: 1,set_input_delay 2,set_output_delay2输入延迟(InputDelay)set_input_delay命令指定输入端口上相对于设计接口处时钟边沿的输入路径延迟。 在考虑应用板时,输入延迟表示以下各项之间的相位差: A.数据从外部芯片通过电路板传播到FPGA的输入封装引脚。 B.相关的板上参考时钟 输入延迟值可以是正的或负的,这取决于设备接口处的时钟和数据相对相位。 虽然-clock选项在Synopsys设计约束(SDC)标准中是可选的,但它是VivadoIDE所必需的。相对时钟可以是设计时钟或虚拟时钟。 使用set_input_delay命令选项 例1:此示例定义了相对于先前定义的sysClk的输入延迟,用于最小和最大分析。>create_clock-namesysClk-period10[get_ports

  • ssh秘钥登录

    自己在网上找ssh秘钥登录的教程,发现写的都不符合我迷糊的那一点:然后自己查man帮助。刚开始的时候不知道Linux如何充当SSHclient,然后自己已解决,解决见下本地生成密钥(publickey和privatekey)。其中,publickey存放在欲登录的服务器上,而privatekey为特定的客户机所持有。当客户机向服务器发出建立安全连接的请求时,首先发送自己的publickey,如果这个publickey是被服务器所允许的,服务器就发送一个经过publickey加密的随机数据给客户机,这个数据只能通过privatekey解密,客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道。通过这种方式,客户机不需要向外发送自己的身份标志“privatekey”即可达到校验的目的,并且privatekey是不能通过publickey反向推断出来的。这避免了网络窃听可能造成的密码泄露。客户机需要小心的保存自己的privatekey,以免被其他人窃取。(这就是为什么先在本地生成密钥,而不是在登录你的vps以后生成然后把私钥下载到本地,任何时

  • 学术初行:了解下期刊

    有时候我们看一些论文期刊,经常会发现一些期刊有国家级期刊、省级期刊、核心期刊这样的标志,那国家级期刊、省级期刊、核心期刊有什么区别?”是时候了解一下了一、什么是期刊?期刊,是由依法设立的期刊出版单位出版图书。期刊出版单位出版期刊,必须经新闻出版总署批准,持有国内统一连续出版物号,领取《期刊出版许可证》。二、期刊有哪些分类?从广义上来讲,期刊的分类,可以分为非正式期刊和正式期刊两种。非正式期刊是指通过行政部门审核领取“内部报刊准印证”作为行业内部交流的期刊(一般只限行业内交流不公开发行),但也是合法期刊的一种,一般正式期刊都经历过非正式期刊过程。正式期刊是由国家新闻出版署与国家科委在商定的数额内审批,并编入“国内统一刊号”,办刊申请比较严格,要有一定的办刊实力,正式期刊有独立的办刊方针。“国内统一刊号”是“国内统一连续出版物号”的简称,即“CN号”,它是新闻出版行政部门分配给连续出版物的代号。“国际刊号”是“国际标准连续出版物号”的简称,即“ISSN号”,我国大部分期刊都配有“ISSN号”。此外,正像报纸一样,期刊也可以不同的角度分类。有多少个角度就有多少种分类的结果,角度太多则流于繁琐

  • IDC:2021年AR-VR头显出货量将达9940万美元

    新设备的推出、VR内容的丰富(面向消费者和企业用户)、设备价格的降低,这些因素都将推动全球AR和VR头显市场以惊人的速度不停增长。IDC(国际数据公司)的最新报告预测,到2021年,全球AR和VR头显的总出货量将达到9940万美元,比2016年的1010万美元增加了近10倍。因此,这五年预测期内的复合年增长率(CAGR)达到了58%“2016年是AR和VR头显市场至关重要的一年。直到2016年,产品才终于到达了终端用户的手上。”IDC致力于AR和VR领域的研究经理RamonLlamas指出:“虽然对AR和VR的明确需求仍主要来自于技术爱好者,但显而易见的是,AR和VR跨越多个垂直行业的企业用例和消费者对游戏和内容消费,也逐渐多了起来。这为设备制造商、平台和内容提供商、开发人员提供了大展身手的舞台。”对于企业用户来说,AR和VR将提高企业的生产率,给予员工看到数据并与之进行交互的途径(如建筑蓝图或人类的器官),而不只是观看一个屏幕上的静态图像。修改和完善可以在正式动工之前进行,这无疑为公司节省了两个宝贵的资源:时间和成本。制造、设计、医疗、交通、零售等垂直市场将从中受益。同时,对于消费者

  • tensorflow | 维度转换

    学习维度转换 shape计算维度tf.shape(input,name=None)复制案例1a=tf.constant([iforiinrange(20)],shape=[2,2,5]) withtf.Session()assess: print(sess.run(tf.shape(a)))复制结果:[225]size计算元素个数tf.size(input,name=None)复制案例2a=tf.constant([iforiinrange(20)],shape=[2,2,5]) withtf.Session()assess: print(sess.run(tf.size(a)))复制结果:20rank计算秩tf.rank(input,name=None)复制案例3a=tf.constant([iforiinrange(20)],shape=[2,2,5]) withtf.Session()assess: print(sess.run(tf.rank(a)))复制结果:3reshape重新的规则排列tf.reshape(tensor,shape,name=None)复制案例4a=tf.

  • QT工程下安卓与win程序切换编译设置

    安卓下的代码在MinGW下调试会从出错 .pro文件后面添加contains(ANDROID_TARGET_ARCH,armeabi-v7a){QT+=androidextras复制 }cpp文件中添加复制 #ifdefQ_OS_ANDROID复制 #include<QtAndroid>复制 #endif读写权限复制 boolrequestReadPermission(){ #ifdefQ_OS_ANDROID QtAndroid::PermissionResultr=QtAndroid::checkPermission("android.permission.READ_EXTERNAL_STORAGE"); if(r==QtAndroid::PermissionResult::Denied){ //QMessageBox::information(0,"requestWritePermission22222","PermissionResult::Denied"); QtAndroid::requestPermissionsSync(QStringList()<&

  • macos 使用 docker 镜像搭建 gitlab 代码仓库

    近期学习了docker技术,一时心血来潮,想要使用docker搭建一个gitlab. 网上搜索gitlabdocker镜像,找到一个汉化版的gitlabdocker镜像GitLab中文社区版Docker镜像 按照镜像页面中的说明步骤进行操作,结果发现没有将镜像的22号端口进行映射。在macos上,22号端口已经占用,所以必须将gitlab服务器的22号端口映射到宿主机的新端口上。 经过几轮试错,现将完整步骤梳理如下。 1.启动容器 本地新建了一个gitlab文件夹,并创建了Makefile,内容如下 init: mkdir-pdata/{etc/gitlab,log/gitlab,opt/gitlab} pull: dockerpullbeginor/gitlab-ce:11.3.0-ce.0 run: dockerrun\ --detach\ --publish9443:443\ --publish9080:80\ --publish9022:22\ --namegitlab\ --restartunless-stopped\ --volume`pwd`/data

  • 人脸检测

    Haar级联分类器 正常人的脸一定具备眼睛、鼻子、嘴巴等特征,每个特征都做成一个专门的检测分类器,所有分类器串起来,全部检测通过则判定为人脸。   分类器下载地址: https://github.com/opencv/opencv/tree/master/data/haarcascades   importcv2 #读取待检测的图像 image=cv2.imread("./111.jpg") cv2.imshow("image",image) #转灰度图 gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #获取级联分类器对象 faceCascade=cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml') #检测 faces=faceCascade.detectMultiScale(gray,1.3,3) print("发现{}个人脸!".format(len(faces))) #绘制人脸框 for(x,y,w,h)inf

  • 20140602

    1 数据库建表,TNS连接PROD 2 一张Status表,插两条记录。时间无限小,全量数据抽过来。 之后每天增量抽取,Append上。打上时间戳。 3 to_char(to_date)弄成一样格式。 解决问题思路、。

  • FlatBuffers要点

      FlatBuffers发布出来一周多,周末便抽时间先研究下它的使用方法。Flatbuffers的idl的语法主要参考[http://google.github.io/flatbuffers/md__schemas.html]。本文主要介绍几个它的monster.fbs没有给出说明的几个语法点和相关的注意事项。 1comment   它的注释中介绍了”///",说明是可以生成documentcomment.我写了如下fbs代码(假设文件名称还是monster.fbs):///structVec3{///x:float;///y:float;///z:float;///}   "flatc-cmonster.fbs"命令编译后,生成代码为: ///structVec3{x:float;y:float;z:float;} 2struct   struct默认的aliagnment是4Byte.   如下fbs代码(假设文件名称还是monster.fbs): structVec4{ x:float; y:short; z:float; w:short; }   "flatc-cm

  • 面试第八篇

    1.输出[[0,0,0,0,0],[0,1,2,3,4],[0,2,4,6,8],[0,3,6,9,12]] r=(4,5) ret=[[x*iforiinrange(0,r[1])]forxinrange(0,r[0])] 复制 2. [{'name':'zs','age':32},{'name':'ls','age':35}]这样一个数据结构,取出name为zs的年龄 print([i['age']foriinsifi['name']=='zs'])复制 3.[i%2foriinrange(10)]和(i%2foriinrange(10))的输出结果分别是什么 [i%2foriinrange(10)]=======>[0,1,0,1,0,1,0,1,0,1] (i%2foriinrange(10))=======>返回一个生成器对象 复制 4.用python实现99乘法表(两种方式) foriinrange(1,10): forjinrange(i,10): print("%d*%d=%d"%(i,j,i*j),end="") print("")

  • \u编码

    总是叫我买衣服,我就在值得买上看了看,发现一个好标题“男装排行榜”,本来想买第一件的,但不包邮就觉得贵了,于是便想搞个脚本每天看这个信息,在网页上看了看,发现是一个方法,然后就不知道了,去rsshub上看没发现有这个排行榜,自己用fiddle抓包,发现有不认识的url,打开一看是谷歌插件购物党的url,还访问了许多,打开看有各种消息,突然看到\u的,想到这可以解码,这才想起来了 这是unicode编码,http://www.bangnishouji.com/tools/chtounicode.html这个可以在线解码 #ResultProtocolHostURLBodyCachingContent-TypeProcessCommentsCustom 66 200 HTTPS browser.gwdang.com /brwext/promo_brand?pg=1&ps=30&order=0&class_id=00000000&dp_id=&title=%E9%95%BF%E8%A2%96%E5%8D%AB%E8%A1%A3_%E7%94%B7

相关推荐

推荐阅读