设计模式之装饰者模式

记一次网络风暴/网络环路 环境: win10 x64 ,联想云教室,电子教室,华三交换机。 状况描述: 最开始开机,一直卡在PXE启动界面,进不去系统。电脑技术张工说,先开教师机后开学生机。因为学生机开机需要读取教师机的镜像。但是状况依旧。 开始排查网络,重启交换机后,发现陆续有几台电脑能登陆进系统桌面了,但很慢起码过了5分钟以上才能进去。 教师机一直都是正常的,然后我在教师机部署电子教室。技术说这电子 教室与云教室IP冲突。 (那之后我查了下这两款软件的PID和端口,所占端口不一样,那没冲突) 我说不可能吧,这套软件在 阅读详情

      装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构性模式,它是作为现有的类的一个包装,这种模式创建了一个装饰类,用来包装原有的类,并保证类方法签名完整的前提下,提供额外的功能。



一、装饰者模式简单介绍

意图:动态的给对象添加一些额外的职责,在不想增加很多子类的情况下扩展类,将具体功能职责划分,同时继承装饰者模式。

主要解决的问题:一般来说我们扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

使用场景:在不影响其它对象的情况下,以动态透明的方式给单个对象添加职责,当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护是可以使用,总之就是一句话 — — 扩展一个类的功能,并动态增加功能,动态撤销功能。


二、装饰者类图

 



三、装饰者模式具体实现演示流程

声明:这里是根据 Head First 一书中的例子来具体演示,进行了相应的总结,大家也可以去参考 Head First,进行更详细的了解

      我们具体来分析一下上面的类图,假设我们去星巴克喝咖啡饮料,不同的咖啡饮料价格可能不一样,如果我们再加些调料,则还需要根据加不同种类的调料重新计价,这里 Beverage (咖啡饮料) 相当于抽象的 Component 类,三个具体组件(HouseBlent、Espresso、DarkRoast)每个代表一种咖啡类型。这里调料装饰者(Mocha、Soy、Whip)请注意:它们除了必须实现 cost() 之外,还必实现 getDescription()。

      通过类图我们看到 CondimentDecorator 扩展自 Beverage 类,这么做的重点在于,装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方,这里我们利用继承达到“类型匹配”,而不是利用继承获得行为。

      上面我们知道为何装饰者需要和被装饰者有相同的“接口”,因为装饰者必须能取代被装饰者,但是我们刚才提到的行为又是从哪里来的?其实当我们将装饰者与组件组合时,就是在加入新的行为,所得到的新行为并不是继承自超类,而是由组合对象得来的。

      总结一下就是:继承 Beverage 抽象类,是为了有正确的类型,而不是继承它的行为,行为来自装饰者和基础组件,或与其它装饰者之间的组合关系,正是如此,因为使用组合对象,可以把所有咖啡饮料喝调料更有弹性的加以混合和匹配。

      最后,我们这里想一下,如果我们需要继承的是 component 类型,为什么不把 Beverage 类设计成一个接口,而是设计成一个抽象类呢?其实这就是很多情况下,我们拿到代码时,Beverage “已经” 是一个抽象类了,通常装饰者模式是采用抽象类,但是 Java 中可以使用接口,尽管如此,通常我们都努力避免修改现有的代码,所以如果是抽象类运作的非常好,还是别去修改它。

接下来我们需要把设计变成代码来实现了


1、先从 Beverage 类下手,代码如下所示:

/**
 * Beverage 是一个抽象类 Beverage 相当于 component 类
 * 
 * @author qiudengjiao
 */
public abstract class Beverage {

	String description = "Unknown  Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

Beverage 类是一个抽象类,有两个方法,getDescription() 和 cost(),getDescription() 已经在此实现了,但是 cost() 必须在子类中实现。


2、接下来我们来实现 CondimentDecorator (调料) 抽象类,也就是装饰者类:

/**
 * 装饰者类(调料)
 * 
 * @author qiudengjiao
 *
 */
public abstract class CondimentDecorator extends Beverage {
	
	/**
	 * 所有的调料装饰者都必须实现 getDescription() 大家可以先考虑下,稍后我们会说
	 */

	public abstract String getDescription();
}

     首先,必须让 CondimentDecorator 能够取代 Beverage,所以将 CondimentDecorator 扩展自 Beverage,原因我们上面已经提到过,其次所有的调料装饰者都必须实现 getDescription() 方法,稍后我们解释为什么。


3、写咖啡饮料的代码

      现在,已经有了基类,我们可以来实现一些具体咖啡饮料,先从浓缩咖啡开始,别忘了我们需要为具体的咖啡饮料设置描述,而且还必须实现 cost() 方法

/**
 * 浓缩咖啡
 * 
 * @author qiudengjiao
 *
 */

public class Espresso extends Beverage {

	public Espresso() {
		description = "Espresso(浓缩咖啡)";
	}

	@Override
	public double cost() {
		return 1.99;
	}
}

      首先让 Espresso 扩展自 Beverage 类,因为 Espresso 是一种咖啡饮料,为了设置咖啡饮料的描述,我们写了一个构造器, description 实例变量继承自 Beverage,最后需要计算 Espresso 的价钱,现在不需要添加调料的价格,直接把 Espresso 的价格1.99 返回即可。

接下来我们来建立另外两种咖啡饮料类(HouseBlend、DarkRoast),和 Espresso 做法都是一样的,不在具体说明,代码如下:

/**
 * 综合咖啡
 * @author qiudengjiao
 *
 */
public class HouseBlend extends Beverage {
	
	public HouseBlend (){
		description = "HouseBlend( 综合咖啡)";
	}

	@Override
	public double cost() {
		return 0.99;
	}
}
/**
 * 焦炒咖啡
 * 
 * @author qiudengjiao
 *
 */
public class DarkRoast extends Beverage {
	
	public DarkRoast() {
		description = "DarkRoast(焦炒咖啡)";
	}

	@Override
	public double cost() {
		return 0.99;
	}
}


4、写调料代码

     如果你再看看装饰者类图,将发现我们已经完成了抽象组件(Beverage),有了具体组件(HouseBlent、Espresso、DarkRoast),也有了抽象装设者(CondimentDecorator),现在我们来实现具体装饰者,先从 Mocha (摩卡) 下手,代码如下:

/**
 * 具体装饰者类(Moche:摩卡)
 * 
 * @author qiudengjiao
 */
public class Moche extends CondimentDecorator {

	Beverage beverage;

	public Moche(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + "+ Moche(摩卡)";
	}

	@Override
	public double cost() {
		return 0.20 + beverage.cost();
	}
}

     摩卡(Mocha)是一个具体装饰者,所以继承自 CondimentDecorator 类,别忘了 CondimentDecorator 类扩展自 Beverage,家挨下来需要让 Mocha 引用一个 Beverage,具体做法如下:

1)用一个实例变量记录咖啡饮料,也就是被装饰者

2)想办法让被装饰者(咖啡饮料)被记录到实例变量中,这里的做法是把咖啡饮料当做构造器的参数,再由构造器将此咖啡饮料记录在实例变量中

具体到 getDescription() 方法,我们希望叙述不只是描述咖啡饮料(例如 DarkRoast),而是完整的连调料都描述出来(例如:darkRoast + Mocha),所以首先利用委托的做法,得到一个叙述,让后在其后加上附加的叙述(例如 Mocha)。

要计算带 Mocha 咖啡饮料的价钱,首先把调用委托给被装饰者对象,以计算价钱,然后再加上 Mocha 的价钱,得到最后结果。

接下来我们来写下 Soy 和 Whip 调料的代码如下:

/**
 * 具体装饰者类(Soy:豆浆)
 * 
 * @author qiudengjiao
 */

public class Soy extends CondimentDecorator {

	Beverage beverage;

	public Soy(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + "+ Soy(豆浆)";
	}

	@Override
	public double cost() {
		return 0.15 + beverage.cost();
	}
}
/**
 * 具体装饰者类(Whip:奶油)
 * 
 * @author qiudengjiao
 */

public class Whip extends CondimentDecorator {

	Beverage beverage;

	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + "+ Whip(奶油)";
	}

	@Override
	public double cost() {
		return 0.10 + beverage.cost();
	}
}


5、 供应咖啡

好了,这时候我们可以坐下来喝杯咖啡了,代码如下:

/**
 * 咖啡饮料具体测试类
 * 
 * @author qiudengjiao
 */
public class StarbuzzCoffee {

	public static void main(String arg[]) {

		// 定一杯 Espresso(浓缩咖啡),不需要调料,打印出它的描述与价钱
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + "=$" + beverage.cost());

		// 定一杯 DarkRoast(焦炒咖啡),加摩卡,加奶油
		Beverage beverage1 = new DarkRoast();
		beverage1 = new Moche(beverage1);
		beverage1 = new Whip(beverage1);
		System.out.println(beverage1.getDescription() + "=$" + beverage1.cost());

		// 定一杯 HouseBlend(综合咖啡),加豆浆,加摩卡,加奶油
		Beverage beverage2 = new HouseBlend();
		beverage2 = new Soy(beverage2);
		beverage2 = new Moche(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() + "=$" + beverage2.cost());
	}
}

我们来看一下具体结果:


好了,我们今天就写到这里,如有错误请指出。



百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析) 本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。 阅读详情

相关推荐

altium room 布局_ALtium 16相同重复模块PCB布局,复制布局走线

自己做了实际工程以后发现PCB器件名字后缀太长了,所以文章最后写了一下后缀的调整方法。第一种方法:1、建立子原理图如下,文件名CANM 2、之后新建一个顶层文件,文件名TOP,之后design—create sheet symbol form sheet or hdl。选择CANM,并放置到TOP中,如下 3、由于我们要多次调用CANM所以使用repeat命令修改如下: 4、之后根据自己的定义,连...

weixin_39609573的博客 5749

设计模式练习(9)——装饰模式

装饰模式 一、题目:简单的手机(SimplePhone)在接收到来电的时候,会发出声音来提醒主人,而现在我们需要为该手机添加一项功能,在接收来电的时候,除了有声音,还能产生震动(JarPhone),还可以得到更加高级的手机(ComplexPhone),来电时,它不仅能够发生,产生震动,而且有灯光闪烁提示,使用装饰模式来模拟手机功能的升级过程,要求绘制类图形编程模拟实现。 (1)给出装饰模式等结构视

秘密基地 6996

Unity 第一人称视角控制移动、旋转

第一人称视角操作此功能主要是借鉴YouTube,写的蛮好我就搬运过来让大家也试试。

qq_36515472的博客 4202

设计模式 | 装饰者模式及典型应用

前言 本文的主要内容: 介绍装饰者模式 示例 源码分析装饰者模式的典型应用 Java I/O 中的装饰者模式 spring session 中的装饰者模式 Mybatis 缓存中的装饰者模式 总结 装饰者模式 装饰者模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。 在装饰者模...

weixin_34197488的博客 1105

Win10下ISE14.7 iMPACT闪退?三步搞定DLL替换(附详细路径)

本文详细介绍了在Windows 10系统下解决Xilinx ISE14.7 iMPACT工具闪退问题的三步DLL替换方案。通过替换关键DLL文件,有效解决了FPGA开发中的兼容性问题,帮助开发者快速恢复工作流程。

weixin_29290259的博客 586

Verilog基础知识11(异步FIFO为什么使用格雷码(gray-code) )

需求说明:Verilog设计 内容       :第一部分 异步FIFO为什么使用格雷码                   第二部分 格雷码在异步FIFO中的使用 来自       :时间的诗 第一部分 异步FIFO为什么使用格雷码 原文:http://www.cnblogs.com/kxk_kxk/p/3931591.html 异步FIFO通

时间的诗 8888

C#设计模式之9-装饰者模式

装饰者模式(Decorator Pattern) 装饰者模式属于结构型模式,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。 装饰者模式通过创建一个包装对象(wrapper),也就是用装饰来包裹真实的对象。 角色: 1、抽象构件(Component) 给出一个抽象接口,以规范准备接收附加责任的对象; 2、具体构件(Concrete Component) 定义...

比特飞 1万+

腾讯云智后台开发实习面试全纪录(已offer)

腾讯云智后台开发实习面经

wenwenaier的博客 5904

一个最简单的装饰模式

如果要对一个List中的元素排序,如果List中的元素是可排序的(实现了Comapable),直接Collections.sort(list).如果要指定排序算法,可以使用Comparator,可以参考:http://blog.youkuaiyun.com/treeroot/archive/2004/10/19/142636.aspxCollections.sort是按升序排序的,如果要按降序呢?其实很简单,

treeroot的专栏 1613

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1695

【信息系统项目管理师】高分论文:论信息系统项目的整合管理(绩效考核系统)

我们将项目管理计划中的子计划包括项目范围、进度、成本、质量管理计划,过程改进计划,人力资源管理计划,风险、采购管理计划,干系人管理计划,项目范围、成本、进度基准作为依据,查看项目的各个方面,通过组织全体团体成员会议来解读由各监控过程提供的信息,之后我与项目管理团队一起制订所需措施,确保项目绩效达到预期要求。在一个项目中,变更是必然的,也是不可避免的,进度拖延,成本失控,客户有新的需求等都会引起项目的变更。在本项目中,我要求有处于工作状态的产品,开发人员才可以对其任意修改,修改完成后,重新入库即可。

数据知道的博客 6887

《JAVA与模式》之装饰模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述装饰(Decorator)模式的:   装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式的结构   装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功...

weixin_30920853的博客 455

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2633

Java设计模式之装饰者模式

Java设计模式之装饰者模式目录一、定义二、具体实现三、使用场景四、优缺点 目录 装饰者模式是结构性设计模式之一,其在不必改变类文件及不使用继承的情况下,动态地扩展一个对象的功能。它通过创建一个包装对象(即装饰)来包裹真实的对象。 一、定义 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 装饰着模式的结构图: 如上结构图所示,装饰者模式中有如下角色: Component:可以是接口或者是抽象类,被装饰的最原始的对象。 ConcreteComponent:组件具体实现类。

红日 6561

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

装饰设计模式

装饰设计模式 ** 说明:装饰设计模式,可以在原有技能的基础上,新增技能,降低继承所带来的耦合性 ** 示例:通过模拟Java官方API中的FileWriter与BufferedWriter来模拟装饰设计模式 第一步:定义接口 public abstract class Writer2 { public abstract void write(); } 第二步:定义过时的类 public...

哈 1034

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

设计模式——装饰模式详解

装饰模式动态地给一个对象添加一些额外的功能,相对于继承的方式,更加灵活。 装饰模式经常被误认为是代理模式。装饰模式是以对客户透明的方式扩展对象的功能,是继承关系的一个替代方案。而代理模式则是给一个对象提供一个代理对象,并由代理对象来控制原有对象的引用。 前者重在增加功能,后者重在对代理对象施加控制,不是对对象本身功能的增强。...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

设计模式之装饰模式

本文介绍了装饰模式的理论与实现。装饰模式能动态地为对象添加职责,比继承更灵活。文章首先阐述了装饰模式的结构,包含抽象构件、具体构件、抽象装饰类和具体装饰类4个角色,并给出了UML类图。然后介绍了透明和半透明两种装饰模式的区别,以及省略抽象装饰类的简化方式。最后通过Java代码示例演示了透明和半透明装饰模式的实现,分别以GUI组件添加滚动条和图形添加阴影效果为例。装饰模式适用于需要动态扩展对象功能且避免继承导致类爆炸的场景,但会增加系统复杂度。完整代码已上传至GitHub仓库。

C2961034922的博客 983

彻底搞懂设计模式DesignPattern-装饰者模式

装饰者模式 定义 装饰者模式: 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。 装饰者模式原理 装饰者模式就像打包一个快递 主体: 比如:陶瓷、衣服 (Component) // 被装饰者 包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator) Component 主体:比如类似前面的Drink ConcreteComponent和

Ping 285

设计模式之装饰器模式

设计模式之装饰器模式

weixin_61492871的博客 1209

设计模式之装饰器设计模式/包装设计模式

给对象增加功能,一般两种方式,继承或关联组合,将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为来增强功能,这个就是装饰器模式,比继承模式更加灵活。也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。JDK源码里面应用最多的就是IO流,大量使用装饰器设计模式。以动态、透明的方式给单个对象添加职责,但又能不改变其结构。角色(装饰者和被装饰者有相同的超类Component)装饰器设计模式(Decorator Pattern)

2302_76363587的博客 1100

java设计模式之装饰器设计模式

装饰器设计模式是一种结构型设计模式,它允许动态地将行为添加到对象中,而无需在对象的类中使用子类化。它允许您通过将对象封装在一个具有新行为的对象中来动态地修改对象的行为。 这种模式是基于组合的思想,而不是继承。 可动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

荷逸的博客 1041

装饰者设计模式(Decorator)、装饰者设计模式在 FilterInputStream 中的应用

1. 概述 1.1 什么是装饰设计模式? 假如现在有一块蛋糕,涂上奶油,就是奶油蛋糕,加上水果就是水果奶油蛋糕,加上生日快乐四个字就是生日蛋糕。 奶油蛋糕,水果奶油蛋糕,生日蛋糕其核心都是蛋糕,经过装饰之后成为目的更明确的蛋糕,更能解决问题。 像这种不断为对象添加装饰的模式就叫 Decorator 模式,Decorator 指的是装饰物。 1.2 装饰者设计模式的角色 核心角色(Componen...

学习笔记 1012

java设计模式——装饰者模式

目录一、装饰者模式的定义与类型二、装饰者模式的适用场景三、装饰者模式的优点四、装饰者模式的缺点五、装饰者模式相关的设计模式六、普通示例:七、普通示例演进,使用装饰者模式示例: 一、装饰者模式的定义与类型 1、定义 在不改变原有对象的基础之上,将功能附加到对象上 提供了比继承更具有弹性的替代方法(扩展原有对象功能) 2、类型 结构型 二、装饰者模式的适用场景 扩展一个类的功能或给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以在动态的撤销 三、装饰者模式的优点 继承的有力补充,比继承灵

小志的博客 1047

设计模式---装饰模式(DesignPattern_Decorator)

摘录自:设计模式与游戏完美开发 十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合...

su9257的博客 117

装饰者设计模式

装饰者模式的定义 装饰者模式:动态的 将新功能 附加到对象身上 。在对象功能扩展方面,它比继承更加有弹性,装饰者模式也体现了开闭原则(OCP) 代码实现 现在模仿一个场景哈,什么场景呢?就是取咖啡店点咖啡这么一个场景 我们先定义一个抽象类,用来描述咖啡和价格 package com.java.springtest.decorator; /** * @author Woo_home * @...

Woo_home的博客 1451

用装饰器设计模式装饰

装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能。 简而言之,此模式通过包装将附加功能添加到对象。 问题陈述: 想像一下我们有一个比萨饼,该比萨饼已经用番茄和奶酪烤制的情况。 之后,您只需要记住,您需要根据客户的选择添加一些其他浇头。 因此,您需要在旅途中再添加一些配料,例如鸡肉和胡椒粉。 意图: 动态地从对象中添加或删除其他功能或职责...

最佳 Java 编程 218

设计模式之装饰设计模式

解决方案:动态的给饮料添加新的功能,而不需要修改饮料的代码。就增加功能来说,装饰模式比继承更加灵活。找出基本组件和可选层次。问题:饮料店订单系统,饮料有咖啡、奶茶、果汁,饮料可以加糖、加奶、加冰。就增加功能来说,Decorator 模式相比生成子类更为灵活。(Decorator) 是一种结构型设计模式,

qq_74811378的博客 443
上一篇: Android 性能优化之内存优化
下一篇: 设计模式之模板方法模式
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值