桥接模式(Bridge Pattern)

模式动机

桥接模式(Bridge Pattern)是一种很实用的结构型模式,如果系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使得两者可以独立扩展。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多重继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。

模式定义

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  • 对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式
  • 用抽象关联取代了传统的多层继承
  • 将类之间的静态继承关系转换为动态的对象组合关系

模式结构

image

案例实现

案例背景

毛笔:颜色和型号实现了分离,增加新的颜色或者型号对另一方没有任何影响

案例结构

image

代码实现

抽象类

public abstract class Pen {

    protected Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw(String name);
}

细化抽象类

public class BigPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "大号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class MiddlePen extends Pen {

    @Override
    public void draw(String name) {
        String penType = "中号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}
public class SmallPen extends Pen {
    @Override
    public void draw(String name) {
        String penType = "小号毛笔绘制";
        this.color.bepaint(penType,name);
    }
}

接口

public interface Color {
    //用于图形着色的方法
    void bepaint(String penType,String name);

}

接口实现类

public class Red implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"红色的"+name+".");
    }
}

public class White implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"白色的"+name+".");
    }
}

public class Green implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"绿色的"+name+".");
    }
}

public class Blue implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"蓝色的"+name+".");
    }
}

public class Black implements Color {
    @Override
    public void bepaint(String penType, String name) {
        System.out.println(penType+"黑色的"+name+".");
    }
}

客户类

public class Client {

    public static void main(String[] args) {

        Color color;
        Pen pen;
        color = (Color) XMLUtilPen.getBean("color");
        pen = (Pen) XMLUtilPen.getBean("pen");

        pen.setColor(color);
        pen.draw("鲜花");

    }

}

实现结果

image

模式分析

  • 桥接模式中体现了很多OOP的思想,包括开闭原则合成复用原则里氏代换原则依赖倒转原则等。
  • 桥接模式可以从接口中分离实现功能,设计更具有扩展性。
  • 桥接模式减少了子类个数,代码简洁。
  • 重点理解如何将抽象化(Abstraction)和实现化(Implementation)脱耦,使得两者可以独立变化。
  • 脱耦
    • 抽象化和实现化之间的耦合解开,或者说是将强关联改换成弱关联,将两个角色之间的继承关系改为关联关系
    • 桥接模式中的所谓脱耦就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合)而不是继承关系,从而使得两者可以相对独立地变化。
    • 继承是强耦合关系。

总结

模式优点

  • 分离抽象接口及其实现部分
  • 可以取代多层继承方案,极大地减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

模式缺点

  • 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就要针对抽象层进行设计与编程
  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情

应用情形

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统

模式扩展

桥接模式与适配器模式经常联合使用,适配器模式可以解决两个已有接口间不兼容的问题,适配器采用增加适配器的方式将第三方类集成到系统中;而桥接模式则通过接口继承或者类继承的方式对系统进行扩展。两个模式用于设计的不同阶段,通常情况下桥接模式用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化。初步设计完成后,当发现系统与已有类无法协同工作时,可以采用适配器模式。

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

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

相关文章

  • 个人阅读习惯的变迁

    6月2日,亚马逊中国发布公告:亚马逊将于2023年6月30日在中国停止Kindle电子书店的运营。大学时代:纸质书与彩屏手机刚读大学时,天天泡图书馆看书,基本不午休,但后来书架上想看的都看完了,其它想看的又没有。只好上网找电子书,但又没电脑,只有一把诺基亚3100,据说是诺基亚出品的第一款彩屏手机,当年硬生生地用它看完了《Windows程序设计》与《Windows环境下32位环境汇编程序设计》,就是下面这把手机,过年回家时无意中看到,就拍照留念下:中间也去网吧下载电子书看,但后来发现网费比直接买书还贵,之后才开始网购纸质书,那本《Shellcoder编程揭秘》就是我第一次网购时买的书。每次拿IT书,总是偷偷摸摸像做贼似的,舍友也不知道我在学这些,毕竟当年这种行为在中医院校还是挺另类的。直到大五那年,拿了腾讯offer(班里第一个找到工作的,医学招聘跟大学IT行业的求职季节还是不太一样)才在学校传开。 那年回去找辅导员开入职需要的证明,直至今日,那对话场景依然历历在目: 辅导员:是去哪家公司? 我:腾讯,卖QQ的那家公司。辅导员:是去当客服吗?我:……Kindle:食之无味,弃之可惜昨天

  • 我眼中的芯片公司FAE工作

    不久前看过一篇很多人转发的关于FAE话题的文章,这两天脑海中突然闪现一个想法:我做过近3年的FAE,是不是也可以写一篇文章分享给大家呢?大家普遍讨论的问题,我就不再重复了。在这里以我亲身经历的几件事情,让大家从另外一个角度来了解FAE。事件1:我在7年前刚毕业时,就加入了一家外企,职位就是FAE,主要是单片机相关的技术支持工作。当年非常幸运,公司可以直接解决北京户口,但是在刚入职后不久,HR就找到我说:由于你的专业名称是控制科学与工程,而你的工作岗位名称是现场应用工程师,在申报材料提交过程中,经办人认为你的专业和工作岗位不对口,需要提供补充说明材料。我当时心里想我上学就学过单片机,不是很对口吗?..所幸后来老板帮忙,花了一晚上时间给我写了一个补充说明,最后才顺利办完流程。前几天我还听说真的有因为这个不对口问题被卡住,最后没办下来户口的。点评:很多人对FAE这个岗位有误解、或者说有些偏见,他们可能会认为FAE没有技术含量,就是个普通的售前售后技术支持。其实不然,芯片公司的FAE和一般的硬件产品公司技术支持有很大的不同,一个硬件产品说明书一般就几页,一个MCU的datasheet少则也得有

  • 主板上这家伙,要当CPU和内存的中间商!

    我是内存条我是一个内存条,刚刚从深圳的一个工厂里被生产出来,跟我一起的还有一批小伙伴,长得跟我一模一样,下了流水线后我们就被扔进了一处黑暗的角落。“这是哪里啊,黑漆漆的”,一个小伙伴说到。“这里是内存条仓库”,黑暗中有人在说话,声音中略有一丝沧桑,像是一个老头。“谁?谁在那里”“别怕,我也是一个内存条,比你们早几个月被生产出来”,那老头说到。“啥,你都被关在这里几个月了,完了完了”,小伙伴急了。“不是的,我出去过,后来被发现是残次品,又被回收了关在了这里,你们跟我不一样,刚刚生产出来,应该很快就能出去,被安装到电脑主板上,实现你们的价值。”“电脑主板?那是什么地方?”,我好奇的问到。那声音继续说到:“那是计算机最核心的地方,是一个巨大的电路板,上面住着CPU、硬盘、网卡、显卡、声卡,当然,还有我们内存条。计算机必须有我们才能正常运转,因为CPU工作需要的指令和数据都存储在咱们内存中”刚说完,我们身边亮起了灯光,这时,我们才看清我和小伙伴们的样子。“我们身上那几块黑乎乎的东西是什么,真是有点拉低颜值啊!” “你可别小瞧了它们,那可是咱们内存条的核心存储芯片,我们的数据都是放在这里面的,它

  • uniapp(vue通用)整合腾讯位置服务SDK---多平台小程序通用

    专属邀请链接:https://lbs.qq.com?lbs_invite=G9MRFLG 项目开始于2021-01-27晚8uniapp模板地址https://ext.dcloud.net.cn/plugin?id=4067 github地址https://github.com/dmhsq/uniapp-txwzsdk-demo 腾讯位置服务牛逼 腾讯位置服务文档小程序SDK:https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/jsSdkOverview 案例一:实现位置共享https://blog.csdn.net/qq_42027681/article/details/113428833 案例二:实现运动轨迹记录https://blog.csdn.net/qq_42027681/article/details/113429566 在线体验(打不开的话可能在审核) 二维码虽然说官方文档写的是微信小程序,但是只要是Js其它平台也应该通用试了下字节小程序可以用在阅读此文章之前需要了解map组件的部分属性属性类型作用longitudeNumber

  • Linux系统中sudo命令的十个技巧总结

    前言在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件等。然而,承担root用户角色的系统管理员可以允许其他正常系统用户在sudo命令和几个配置的帮助下运行某些命令以及执行包括上述的一些重要系统操作。sudo表示“superuserdo”。它允许已验证的用户以其他用户的身份来运行命令。其他用户可以是普通用户或者超级用户。然而,大部分时候我们用它来以提升的权限来运行命令。sudo命令与安全策略配合使用,默认安全策略是sudoers,可以通过文件/etc/sudoers来配置。其安全策略具有高度可拓展性。人们可以开发和分发他们自己的安全策略作为插件。与su的区别在GNU/Linux中,有两种方式可以用提升的权限来运行命令:使用su命令使用sudo命令su表示“switchuser”。使用su,我们可以切换到root用户并且执行命令。但是这种方式存在一些缺点:我们需要与他人共享root的密码。因为root用户为超级用户,我们不能授予受控的访问权限。我们无法审查用户在做什么。sudo以独

  • 自然语言处理中的预训练模型(上)

    本文是最近比较火的一篇关于预训练模型的综述「Pre-trainedModelsforNaturalLanguageProcessing:ASurvey」的阅读笔记。由于篇幅较长,所以分成两篇发送。1引言随着深度学习的发展,各种各样的神经网络被用来解决「自然语言处理」(NLP)问题,例如卷积神经网络、循环神经网络、图神经网络、注意力机制等等。与传统方法相比,神经模型的一个优点是可以「缓解特征工程问题」。传统方法通常严重依赖于人工提取的特征,而神经方法通常使用低维且低密度的向量(即分布式表示)来含蓄地表达语言的句法及语法特征,这些表示会在具体的NLP任务中学习得到。因此,神经方法让人们能够更轻松地开发各种NLP系统。虽然神经模型在NLP任务中已经取得了成功,但是其性能提升相对计算机视觉领域来说还是不够明显。一个主要原因在于目前的数据集对于大部分有监督NLP任务来说都很小(除了机器翻译),深度神经网络通常有大量的参数,而较小的训练数据集会导致过拟合的出现。因此,早期的面向NLP任务的神经模型都相对较浅,往往只包含1-3层。近年来,大量的研究表明基于大型语料库的「预训练模型」(PTM)可以学习

  • C++核心准则编译边学-F.26 使用unique_ptr<T>代替指针传递所有权

    F.26:Useaunique_ptr<T>totransferownershipwhereapointerisneededF.26使用unique_ptr<T>代替指针传递所有权Reason(原因)Usingunique_ptristhecheapestwaytopassapointersafely.使用unique_ptr是成本最低的安全地传递指针的方式。 Seealso:C.50regardingwhentoreturnashared_ptrfromafactory.参见:C.50关于什么时候从工厂返回shared_ptr。 Example(示例)unique_ptr<Shape>get_shape(istream&is)//assembleshapefrominputstream { autokind=read_header(is);//readheaderandidentifythenextshapeoninput switch(kind){ casekCircle: returnmake_unique<Circle>(

  • Python - SocketIO 请求

    Python-模拟WebSocket请求Max.Bai2017-04需要用到socketio-client,logging1.安装SockeIO-Clientpipinstallsocketio-client-22.创建连接发送数据fromsocketIO_clientimportSocketIO hosts='http://websocke.server.com' port=3000 #收到message消息处理过程 defon_message(*args): #print"recv:",args #print"geted:",type(args[0]) iftype(args[0])istypes.DictType: rp=args[0] print"recv:",rp sk=SocketIO(hosts,port=port) sk=SocketIO(hosts,port=port,params={'token':'ksdjfkjdf'})#createc

  • Java IO与NIO

    IO流学习总结 一 JavaIO,硬骨头也能变软二 javaIO体系的学习总结三 JavaIO面试题NIO与AIO学习总结一JavaNIO概览二JavaNIO之Buffer(缓冲区)三JavaNIO之Channel(通道)四JavaNIO之Selector(选择器)五JavaNIO之拥抱Path和Files六NIO学习总结以及NIO新特性介绍七JavaNIOAsynchronousFileChannel异步文件通八高并发Java(8):NIO和AIOIO流学习总结(1)按操作方式分类结构图:(2)按操作对象分类结构图:二 javaIO体系的学习总结1、IO流的分类:按照流的流向分,可以分为输入流和输出流;按照操作单元划分,可以划分为字节流和字符流;按照流的角色划分为节点流和处理流。2、流的原理浅析:javaIo流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系,JavaIo流的40多个类都是从如下4个抽象类基类中派生出来的。1、InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。2、OutputStream

  • [译]使用 Proxy 更好的封装 Storage API

    [译]使用Proxy更好的封装StorageAPI⭐️更多前端技术和知识点,搜索订阅号JS菌订阅 看到篇文章觉得不错,原文:https://davidwalsh.name/javascript-proxy-with-storage。讲的是使用Proxy来封装StorageAPI,做一层提供存取数据的代理层。这里简单翻译一下这篇文章的主要内容。封装Storage这篇文章提到Proxy这种语法可以用来封装sessionStorage、localStorage甚至是IndexedDB。可以使用Proxy代理来使API更容易使用。首先介绍一下Proxy的基本用法:/* constproxy=newProxy({},{ get:(obj,prop)=>{...}, set:(obj,prop,value)=>{...}, //morepropshere }); */ //Thisbasicproxyreturnsnullinsteadofundefinedifthe //propertydoesn'texist //如果属性不存在那么返回的是null而不是undefine

  • CTF实战33 综合实战和讲解三

    倒数第二次拜祖师爷啦~重要声明该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关今天进入我们复习的最后一课题目:这里我们挑选了三个比较有代表性的CTF题 其中有 139是稀奇古怪题 140是标准的CTFWEB类的题 而141是一个真实的渗透测试靶机(漏洞比较多) 然后希望大家可以对照着141拟撰一个渗透测试报告 然后发群里我会帮你们订正订正然后修改修改 毕竟不要学半天渗透 还不会写渗透测试报告是不 啊哈哈哈复制小提示:HaveFun~难度(高中低)139是中的140是高的141是低的IP地址:10.9.0.13910.9.0.14010.9.0.141且flag的MD5值为many复制本文完下期内容:没有了~

  • Concur牵手滴滴企业版,企业级软件+互联网服务可以复制吗?

    12月1日,全球企业管理软件老大SAP旗下的Concur在北京举办财务峰会,在会上Concur公司全球总裁MikeEberhard特别提到与滴滴企业版的合作——三个月前,Concur与滴滴在产品上打通。现在,Concur发现,已经有超过10%的Concur用户在通过Concur与滴滴企业版账户关联,提交出行报销。Concur是企业差旅和费用管理解决方案商的代表,成立于1993年,1998年已在美国上市,2014年被SAP收购。它负责帮助企业的员工和客户通过系统搞定差旅这件事情。与滴滴出行合作之后,企业在Concur界面中关联滴滴企业版账户之后,员工就可以在Concur上安排滴滴行程和报销车费了。差旅出行一直是企业痛点Concur与滴滴合作的故事并不是孤例。10月11日,阿里钉钉增加“企业服务”,涵盖企业员工的差旅报销、订餐、用车、健康、社保诸多服务,用车服务合作伙伴就是滴滴企业版,使用阿里钉钉的企业员工,就可以直接在钉钉上预订滴滴服务了。更早之前,中国企业级软件云之家也有过类似尝试。之所以企业级软件纷纷希望接入“差旅出行”,最核心的原因在于差旅出行一直是企业的痛点。过去企业员工因公出差

  • jquery clone()表格之后查找里边的元素

    clone()克隆匹配的DOM元素并且选中这些克隆的副本。在想把DOM文档中元素的副本添加到其他位置时这个函数非常有用。要做到动态添加表格,并且添加后修改表格中每一列的值,非常方便js代码 $(function(){   vartemplateTr=$("#templateRow").clone(); varfirstTd=templateTr.find("td:eq(0)");   varsecondTd=templateTr.find("td:eq(1)");   firstTd.html("helloworld")   alert(secondTd.html());  });复制html代码   <tableid="tableId"width="100%"border="0"cellspacing="0"cellpadding="0"class="common-table"he

  • sqlserver 视图创建索引_数据库视图可以建立索引吗

    大家好,又见面了,我是你们的朋友全栈君。文章目录操作前准备一、视图1、创建视图2、更新视图3、删除视图二、索引1、聚集索引2、非聚集索引3、创建索引语法格式:4、删除索引代码全部示例操作前准备一、视图1、创建视图视图(View)是从一个或多个表或其它视图导出的,用来导出视图的表称为基表,导出的视图又称为虚表。在数据库中,只存储视图的定义,不存放视图对应的数据,这些数据仍然存放在原来的基表中。 使用视图前,必须先创建视图,创建视图要遵守以下原则: (1)只有在当前数据库中才能创建视图,视图命名必须遵循标识符规则。 (2)不能将规则、默认值或触发器与视图相关联。 (3)不能在视图上建立任何索引。T-SQL创建视图的语句是CREATEVIEW语句。语法格式:CREATEVIEW[schema_name.]view_name[(column[,...n])] [WITH<view_attribute>[,…n]] ASselect_statement [WITHCHECKOPTION]复制说明: view_name:视图名称;scheme是数据库架构名 column:列名,此为

  • 理解代价函数

    Q:为什么会提及关于代价函数的理解? A:在ML中线性回归、逻辑回归等总都是绕不开代价函数。 理解代价函数:是什么?作用原理?为什么代价函数是这个?   1、代价函数是什么?   代价函数就是用于找到最优解的目的函数,这也是代价函数的作用。   损失函数(LossFunction)是定义在单个样本上的,算的是一个样本的误差。   代价函数(CostFunction)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。   目标函数(ObjectFunction)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是CostFunction+正则化项)。   2、代价函数作用原理   对于回归问题,我们需要求出代价函数来求解最优解,常用的是平方误差代价函数。   比如,对于下面的假设函数:   里面有θ0和θ1两个参数,参数的改变将会导致假设函数的变化,比如:   现实的例子中,数据会以很多点的形式给我们,我们想要解决回归问题,就需要将这些点拟合成一条直线,找到最优的θ0和θ1来使这条直线更能代表所有数据。   而如何找到最优解呢,就需要使用

  • 如你所见

    如你所见,这是一篇测试皮肤的文章

  • Codeforces Round #656 (Div. 3)

    CodeforcesRound#656(Div.3) A.ThreePairwiseMaximums 题意 给你三个数\(x=max(a,b),y=max(b,c),z=max(c,a)\) 构造\(a,b,c\)使得其满足题目给定的\(x,y,z\)。 题解 讨论一下是否存在两个相等最大值就好了。 事实上题目要求中说了可以不按顺序,那就更方便了(但是我没看见QwQ) #include<iostream> #include<cstdio> usingnamespacestd; inlineintread() { intx=0;boolt=false;charch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); returnt?-x:x; } intmain() { in

  • LeetCode Hard 选做

    目录4.寻找两个正序数组的中位数10.正则表达式匹配23.合并K个升序链表25.K个一组翻转链表30.串联所有单词的子串32.最长有效括号37.解数独41.缺失的第一个正数42.接雨水154.寻找旋转排序数组中的最小值IInull381.O(1)时间插入、删除和获取随机元素-允许重复1931.用三种不同颜色为网格涂色1938.查询最大基因差 题目链接 感受一下自己能不能切lc的hard题(退役后这么闲的怕是就我一个)。 hard间难度差异很大,有的巨水像easy,所以可能会挑着做。 基本都是DP/数学/计算几何,我这种主做数据结构的怎么办 lc的题难度差异真是大,同是Hard难度可能一个easy一个真hard。 不过主要问题还是,题目描述随意,数据不写清,没什么规范。 4.寻找两个正序数组的中位数 /* O(n)的话很简单。 log做法的话,假设第$k$大在A数组的$A[p]$位置,则应有$A[p]>B[k-1-p]$,以保证比$A[p]$小的数至少有$k-1$个。 如果满足条件,尝试左移$p$以找到最小的满足“比$A[p]$小的数至少有$k-1$个”的数;如果不满足,则

  • scrcpy – Android无需ROOT投屏工具

    目录设备要求检查ADB安装scrcpyWindowsMacOSLinux命令行执行设备要求Android5.0以上开发者模式启动并且打开USB调试选项检查ADB在命令行里打adb,如果有反应就说明已经有ADB,如果提示commandnotfound就说明没有安装ADB如果没有ADB需要先安装ADB Windows MacOS Linux安装scrcpyWindowsscrcpy-win32-v1.16.zipscrcpy-win64-v1.16.zip在系统环境变量里配置以后,直接win+r输入scrcpy就可以启动,非常方便MacOS可以通过Homebrew直接安装brewinstallscrcpy复制LinuxArchLinuxscrcpyscrcpy-prebuiltserver命令行执行启动scrcpyscrcpy复制查看帮助scrcpy--help复制ActionShortcut切换全屏模式Ctrl+f将窗口调整为1:1(完美像素)Ctrl+g调整窗口大小以删除黑色边框Ctrl+x|双击黑色背景设备HOME键Ctrl+h|鼠标中键设备BACK键Ctrl+b|鼠标右键设备任务管

  • vi在一般指令模式下几个实用的命令

    按键 说明 [Ctrl]+[f] 向下翻一页 [Ctrl]+[b] 向上翻一页 0或者功能键[Home] 移动到这行头部 $或者功能键[end] 移动到这行尾部 G 移动到文档的最后一行 <n>G 移动到文档的第几行 gg 移动到文档的第一行 <n>Enter 向下移动几行 /word 自光标向下查找匹配的word字符 :n1,n2s/word1/word2/g 从n1行到n2行把word1替换成word2 :1,$s/word1/word2/gc 从n1行到n2行把word1替换成word2,需要确认 dd 删除光标所在行 ndd 删除光标下n行 yy 复制所在行 nyy 复制光标下面n行 p,P p粘贴到光标下一行,P复制到光标上一行 u 撤销上一个操作

  • 在自己写的C#类中调用 ASP.NET的Request,server 等对象

    复制 加命名空间(可能需要在项目中先加引用,再在类中如下引用)复制 usingSystem.Web.SessionState; HttpContext.Current.Session["TotalPage"].ToString(); HttpContext.Current.Request.QueryString["cid"].ToString();复制  

相关推荐

推荐阅读