设计模式之装饰模式

一、前言

当前的系统设计无法满足我的需求,急需动态的添加更多是功能的时候,我们选择装饰模式来完成这一项任务,我们知道通过继承也可以是实现功能的添加,如果依赖继承,那么类的行为只能在编译时静态决定,换句话说,行为如果不是来自超类,就是来自子类覆盖后的版本,同时,我们还要修改现有的代码。

二、定义

装饰模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

三、类图

 

 

四、举例

在生活中我们也有很多的生活场景类似于装饰模式的使用。结合在网上看到的其他案例,以手抓饼为例来阐述装饰模式。

首先我们将手抓饼提取为一个抽象类或者接口来实现不太配料手抓饼的制作。Java语言仅支持单继承,我们这里就使用接口来说明。

/**
 * 手抓饼接口,所以的手抓饼都出自该接口
 *
 */
public interface Pancake {
	
	public String getDesc();//对该手抓饼的描述
	
	public double getPrice();//该手抓饼的价格

}

这个接口就是抽象组件Component,也是一个类的基本功能。

下面我们实现该接口,来生产没有任何配菜的低配手抓饼

/**
 * 低配手抓饼,只有一个饼,价格为4元
 *
 */
public class BasePancake implements Pancake {

	@Override
	public String getDesc() {
		
		return "饼";
	}

	@Override
	public double getPrice() {
		
		return 4;
	}

}

我们可以看到低配手抓饼(ConcreteComponent,抽象组件的具体实现)什么也没有加,只有一个饼,价格为4元。

当我们想给手抓饼添加各种配料并且计算出不同的价格,我们需要一个装饰接口来继承Component.。

/**
 * 手抓饼的加项类,该处继承手抓饼接口时为了达到“类型匹配”而不是获得“行为”
 *
 */
public interface Charge extends Pancake {
	
	//这里也可以添加新的方法

}

这里继承了Component是为了实现类型匹配,所以在这个接口里面,我们什么也没有做。

下面,我们需要具体的装饰类来装饰ConcreteComponent

 

/**
 * 加项鸡蛋类,该类实现了装饰接口Charge
 *
 */
public class Egg implements Charge {
	
	Pancake pancake;//内部持有手抓饼的基类
	
	/*
	 * 在构造的时候实例化手抓饼的类型
	 * */
	public Egg(Pancake pancake) {
		this.pancake = pancake;
	}

	@Override
	public String getDesc() {
		
		return pancake.getDesc()+"加鸡蛋";
	}

这里有一个鸡蛋类,实现类装饰接口Charge,内部持有一个手抓饼对象,并且在构造函数中来实例化该对象。 

测试:

public static void main(String[] args) {
		
		//首先购买一个低配的手抓饼,即什么都不加,只有一个饼
		
		BasePancake basePancake=new BasePancake();
		
		System.out.println("我购买的手抓饼是:"+basePancake.getDesc()+",价格是:"+basePancake.getPrice());
		
		
		//购买一个加鸡蛋的饼
		Egg egg=new Egg(basePancake);
		System.out.println("我购买的手抓饼是:"+egg.getDesc()+",价格是:"+egg.getPrice());
		
		
	}

************************************************************************
我购买的手抓饼是:饼,价格是:4.0
我购买的手抓饼是:饼加鸡蛋,价格是:5.0

如果我们需要增加更多的配料,我们只需要增加一些配料类来实现Charge接口,无需修改其他代码。 

五、优缺点

优点:

装饰者模式充分体现了对修改关闭,对拓展开放的开闭原则,装饰着可以在被装饰的行为前面或者后面加上自己的行为,甚至将被装饰者的行为完全取代,从而达到特定的目的。

 

缺点:

但是装饰者在设计的过程中会出现许多小对象,如果过度使用装饰者,会让程序变的复杂。装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出较佳选择。

六、使用场景

1、动态、透明的给对象添加职责;

2、有的一组基本功能进行排列组合而产生非常多的功能时;

 

JFM7VX690T型SRAM型现场可编程门阵列技术手册主要介绍的是上海复旦微电子集团股份有限公司(简称复旦微电子)生产的高性能FPGA产品JFM7VX690T。该产品属于JFM7系列,具有现场可编程特性,集成了功能强大且可以灵活配置组合的可编程资源,适用于实现多种功能,如输入输出接口、通用数字逻辑、存储器、数字信号处理和时钟管理等。JFM7VX690T型FPGA适用于复杂、高速的数字逻辑电路,广泛应用于通讯、信息处理、工业控制、数据中心、仪表测量、医疗仪器、人工智能、自动驾驶等领域。 产品特点包括: 1. 可配置逻辑资源(CLB),使用LUT6结构。 2. 包含CLB模块,可用于实现常规数字逻辑和分布式RAM。 3. 含有I/O、BlockRAM、DSP、MMCM、GTH等可编程模块。 4. 提供不同的封装规格和工作温度范围的产品,便于满足不同的使用环境。 JFM7VX690T产品系列中,有多种型号可供选择。例如: - JFM7VX690T80采用FCBGA1927封装,尺寸为45x45mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T80-AS同样采用FCBGA1927封装,但工作温度范围更广,为-55°C到+125°C,同样使用锡银焊球。 - JFM7VX690T80-N采用FCBGA1927封装和铅锡焊球,工作温度范围与JFM7VX690T80-AS相同。 - JFM7VX690T36的封装规格为FCBGA1761,尺寸为42.5x42.5mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T36-AS使用锡银焊球,工作温度范围为-55°C到+125°C。 - JFM7VX690T36-N使用铅锡焊球,工作温度范围与JFM7VX690T36-AS相同。 技术手册中还包含了一系列详细的技术参数,包括极限参数、推荐工作条件、电特性参数、ESD等级、MSL等级、重量等。在产品参数章节中,还特别强调了封装类型,包括外形图和尺寸、引出端定义等。引出端定义是指对FPGA芯片上的各个引脚的功能和接线规则进行说明,这对于FPGA的正确应用和电路设计至关重要。 应用指南章节涉及了FPGA在不同应用场景下的推荐使用方法。其中差异说明部分可能涉及产品之间的性能差异;关键性能对比可能包括功耗与速度对比、上电浪涌电流测试情况说明、GTH Channel Loss性能差异说明、GTH电源性能差异说明等。此外,手册可能还提供了其他推荐应用方案,例如不使用的BANK接法推荐、CCLK信号PCB布线推荐、JTAG级联PCB布线推荐、系统工作的复位方案推荐等,这些内容对于提高系统性能和稳定性有着重要作用。 焊接及注意事项章节则针对产品的焊接过程提供了指导,强调焊接过程中的注意事项,以确保产品在组装过程中的稳定性和可靠性。手册还明确指出,未经复旦微电子的许可,不得翻印或者复制全部或部分本资料的内容,且不承担采购方选择与使用本文描述的产品和服务的责任。 上海复旦微电子集团股份有限公司拥有相关的商标和知识产权。该公司在中国发布的技术手册,版权为上海复旦微电子集团股份有限公司所有,未经许可不得进行复制或传播。 技术手册提供了上海复旦微电子集团股份有限公司销售及服务网点的信息,方便用户在需要时能够联系到相应的服务机构,获取最新信息和必要的支持。同时,用户可以访问复旦微电子的官方网站(***以获取更多产品信息和公司动态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值