@[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)。
权衡:
* 由于扩展对象的管理,可能会增加复杂性。
* 如果对象和扩展之间的交互设计效率不高,可能会引入性能开销。
## 九、源码下载
[扩展对象模式示例代码下载](链接待补充)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
扩展对象模式允许在不修改对象结构的情况下灵活扩展对象的行为,通过附加额外的对象来动态添加新的功能。 ## 二、别名 * 接口扩展 ## 三、扩展对象设计模式的意图 扩展对象模式的目的是通过附加能够动态添加新功能的额外对象,在不修改对象结构的情况下灵活扩展对象的行为。 ## 四、通过实际示例详细解释扩展对象模式 实际示例: > 在现实世界中,模块化厨房电器是扩展对象设计模式的一个类似例子。考虑一个基本的搅拌机单元,用户可以为其添加不同的附件,如食品加工器、榨汁机或研磨机。每个附件都为搅拌机添加了新的功能,而无需改变基本单元本身。用户可以根据当前需求动态地在不同功能之间切换,使搅拌机具有高度的通用性和适应性,能够执行各种任务。这反映了软件中的扩展对象模式,在该模式中,新功能被动态地、有针对性地添加到对象中,增强了灵活性和重用性。 通俗解释: > 扩展对象模式用于在不修改对象核心类的情况下动态地为对象添加功能。它是一种行为设计模式,用于向现有程序中的现有类和对象添加新功能。该模式使程序员能够扩展/修改类功能,而无需重构现有源代码。 维基百科说: > 在面向对象的计算机编程中,扩展对象模
资源推荐
资源详情
资源评论
收起资源包目录
extension-objects.zip (25个子文件)
extension-objects
pom.xml 2KB
src
test
java
concreteextensions
CommanderTest.java 2KB
SoldierTest.java 2KB
SergeantTest.java 2KB
units
SoldierUnitTest.java 2KB
SergeantUnitTest.java 2KB
CommanderUnitTest.java 2KB
UnitTest.java 2KB
AppTest.java 2KB
main
java
concreteextensions
Sergeant.java 2KB
Commander.java 2KB
Soldier.java 2KB
App.java 3KB
units
Unit.java 2KB
SoldierUnit.java 2KB
SergeantUnit.java 2KB
CommanderUnit.java 2KB
abstractextensions
CommanderExtension.java 1KB
UnitExtension.java 1KB
SergeantExtension.java 1KB
SoldierExtension.java 1KB
etc
extension-objects.urm.puml 18B
extension_obj.png 37KB
extension_obj.ucls 11KB
README.md 7KB
共 25 条
- 1
资源评论
道长不会写代码
- 粉丝: 2534
- 资源: 117
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术资料分享uCOS-II信号量集很好的技术资料.zip
- 技术资料分享ucOS-II入门教程(任哲)很好的技术资料.zip
- 技术资料分享UCOSII 2.90 ReleaseNotes很好的技术资料.zip
- 技术资料分享Ucos-II-中文注释版很好的技术资料.zip
- 技术资料分享uCGUI的性能与资源占用很好的技术资料.zip
- 技术资料分享uCGUI 简介很好的技术资料.zip
- 技术资料分享TJA1050很好的技术资料.zip
- 技术资料分享TF应用很好的技术资料.zip
- CourseDesign_Graph-数据结构课程设计
- AndroidStudio Demo-android studio计算器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功