@[TOC]
# 【Java设计模式】扩展对象模式
## 一、概述
扩展对象模式允许在不修改对象结构的情况下灵活扩展对象的行为,通过附加额外的对象来动态添加新的功能。
## 二、别名
* 接口扩展
## 三、扩展对象设计模式的意图
扩展对象模式的目的是通过附加能够动态添加新功能的额外对象,在不修改对象结构的情况下灵活扩展对象的行为。
## 四、通过实际示例详细解释扩展对象模式
实际示例:
> 在现实世界中,模块化厨房电器是扩展对象设计模式的一个类似例子。考虑一个基本的搅拌机单元,用户可以为其添加不同的附件,如食品加工器、榨汁机或研磨机。每个附件都为搅拌机添加了新的功能,而无需改变基本单元本身。用户可以根据当前需求动态地在不同功能之间切换,使搅拌机具有高度的通用性和适应性,能够执行各种任务。这反映了软件中的扩展对象模式,在该模式中,新功能被动态地、有针对性地添加到对象中,增强了灵活性和重用性。
通俗解释:
> 扩展对象模式用于在不修改对象核心类的情况下动态地为对象添加功能。它是一种行为设计模式,用于向现有程序中的现有类和对象添加新功能。该模式使程序员能够扩展/修改类功能,而无需重构现有源代码。
维基百科说:
> 在面向对象的计算机编程中,扩展对象模式是在原始对象编译后添加到对象的设计模式。修改后的对象通常是一个类、一个原型或一个类型。扩展对象模式是一些面向对象编程语言的特性。调用扩展方法和调用类型定义中声明的方法之间没有语法区别。
## 五、Java中扩展对象模式的编程示例
扩展对象模式允许在不修改对象结构的情况下灵活扩展对象的行为,通过附加额外的对象来动态添加新的功能。
在这个Java实现中,我们有三种类型的单元:`SoldierUnit`、`SergeantUnit`和`CommanderUnit`。每个单元都可以有扩展,提供额外的功能。扩展是`SoldierExtension`、`SergeantExtension`和`CommanderExtension`。
`Unit`类是所有单元的基类。它有一个方法`getUnitExtension`,根据扩展名称返回一个扩展对象。
```java
public abstract class Unit {
private String name;
protected Unit(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract UnitExtension getUnitExtension(String extensionName);
}
```
`UnitExtension`接口是所有扩展的基接口。每个特定的扩展都将实现这个接口。
```java
public interface UnitExtension {
String getName();
}
```
`SoldierUnit`类是一种特定类型的单元。它重写了`getUnitExtension`方法,以返回一个`SoldierExtension`对象。
```java
public class SoldierUnit extends Unit {
public SoldierUnit(String name) {
super(name);
}
@Override
public UnitExtension getUnitExtension(String extensionName) {
if ("SoldierExtension".equals(extensionName)) {
return new SoldierExtension(this);
}
return null;
}
}
```
`SoldierExtension`类是一种特定类型的扩展。它实现了`UnitExtension`接口,并为`SoldierUnit`提供了额外的功能。
```java
public class SoldierExtension implements UnitExtension {
private SoldierUnit unit;
public SoldierExtension(SoldierUnit unit) {
this.unit = unit;
}
@Override
public String getName() {
return "SoldierExtension";
}
public void soldierReady() {
// 为SoldierUnit提供的额外功能
}
}
```
在`main`应用程序中,我们创建不同类型的单元,并检查每个单元是否有扩展。如果扩展存在,我们调用扩展对象上的特定方法。
```java
public class App {
public static void main(String[] args) {
var soldierUnit = new SoldierUnit("SoldierUnit1");
var sergeantUnit = new SergeantUnit("SergeantUnit1");
var commanderUnit = new CommanderUnit("CommanderUnit1");
checkExtensionsForUnit(soldierUnit);
checkExtensionsForUnit(sergeantUnit);
checkExtensionsForUnit(commanderUnit);
}
private static void checkExtensionsForUnit(Unit unit) {
var extension = "SoldierExtension";
Optional.ofNullable(unit.getUnitExtension(extension))
.map(e -> (SoldierExtension) e)
.ifPresentOrElse(SoldierExtension::soldierReady, () -> System.out.println(unit.getName() + " without " + extension));
}
}
```
这将产生以下控制台输出。
```
22:58:03.779 [main] INFO concreteextensions.Soldier -- [Soldier] SoldierUnit1 is ready!
22:58:03.781 [main] INFO App -- SoldierUnit1 without SergeantExtension
22:58:03.782 [main] INFO App -- SoldierUnit1 without CommanderExtension
22:58:03.782 [main] INFO App -- SergeantUnit1 without SoldierExtension
22:58:03.783 [main] INFO concreteextensions.Sergeant -- [Sergeant] SergeantUnit1 is ready!
22:58:03.783 [main] INFO App -- SergeantUnit1 without CommanderExtension
22:58:03.783 [main] INFO App -- CommanderUnit1 without SoldierExtension
22:58:03.783 [main] INFO App -- CommanderUnit1 without SergeantExtension
22:58:03.783 [main] INFO concreteextensions.Commander -- [Commander] CommanderUnit1 is ready!
```
这个示例展示了扩展对象模式如何允许在不修改对象结构的情况下灵活扩展对象的行为。
## 六、何时在Java中使用扩展对象模式
该模式适用于对象的功能需要在运行时扩展的场景,避免了子类化的复杂性。它特别适用于系统中对象的功能需要在部署后增强,或者对象的功能在不同实例之间可能有很大差异的情况。
## 七、扩展对象模式在Java中的实际应用
* 在应用服务器中扩展服务而不修改现有代码。
* 在像IntelliJ IDEA或Eclipse这样的IDE中使用插件为基本应用程序添加功能。
* 根据许可证级别在企业软件中启用额外功能。
* [OpenDoc](https://en.wikipedia.org/wiki/OpenDoc)
* [Object Linking and Embedding](https://en.wikipedia.org/wiki/Object_Linking_and_Embedding)
## 八、扩展对象模式的好处和权衡
好处:
* 通过允许动态扩展对象的功能来增强灵活性。
* 促进了基本对象与其扩展之间的松散耦合。
* 通过保持对象对扩展开放但对修改关闭,支持[开闭原则](https://java-design-patterns.com/principles/#open-closed-principle)。
权衡:
* 由于扩展对象的管理,可能会增加复杂性。
* 如果对象和扩展之间的交互设计效率不高,可能会引入性能开销。
## 九、源码下载
[扩展对象模式示例代码下载](链接待补充)
道长不会写代码
- 粉丝: 2535
- 资源: 117
最新资源
- (179719018)NPC三电平逆变器改进同步载波调制算法仿真 (同步SPWM,同步SVPWM) 本仿真的优点: 1)三电平逆变器的输出相电压保持
- 基于springboot的校园新闻网站源码(java毕业设计完整源码+LW).zip
- (19059030)java开发学生信息管理系统
- 攀爬机器人sw2016含cad可编辑全套技术资料100%好用.zip
- C#源码 上位机 SECS协议,里面包含各种进制转,用于半导体行业,程序全源码
- 2019年江西省职业院校技能大赛网络搭建与应用竞赛方案
- 一款同时支持JAVA REST API和JAVA WebSocket和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念
- 全方位平面定位系统sw2018可编辑全套技术资料100%好用.zip
- nginx-1.23.2版本RPM包
- 三相电流型PWM整流matlab仿真,采用电压外环和电流内环的双闭环控制策略,附赠自己整理的说明文档和几篇参考文献
- 自然人电子税务局(扣缴端)个税官网下载 ETax模拟电子税务局学习系统 自然人电子税务局扣缴客户端数据恢复电脑重装个税数据丢失怎么处理数据丢失了怎么办备份更换电脑后,教你轻松恢复个税扣缴端数据个税扣缴
- deletexxxxxxxxxxxxxxxxxxxxxxxxxx
- 练习-登录123401
- 雷电模拟器安装Lxposed
- 双馈风机次同步振荡抑制策略(一) 含 基于转子侧附加阻尼控制(SDC)的双馈风机次同步振荡抑制,不懂就问, 附加阻尼控制 (SDC)被添加到 RSC 内部控制器的q轴输出中 这种方法是由Andres
- 基于springboot的新生宿舍管理系统源码(java毕业设计完整源码+LW).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈