【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

简介: 【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

🔍 目的


使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。


🔍 解释


抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口

真实世界例子

考虑由多个部分组成的计算机。 但是,我们不知道特定计算机是否真的拥有所有零件,或者仅仅是零件中的一部分。 我们的计算机是动态而且非常灵活的。

通俗的说

抽象文档模式允许在对象不知道的情况下将属性附加到对象。

维基百科

面向对象的结构设计模式,用于组织松散类型的键值存储中的对象并使用类型化的视图公开数据。 该模式的目的是在强类型语言中实现组件之间的高度灵活性,在这种语言中,可以在不丢失类型安全支持的情况下,将新属性动态地添加到对象树中。 该模式利用特征将类的不同属性分成不同的接口。


🔍 程序示例

让我们首先定义基类DocumentAbstractDocument。 它们基本上使对象拥有属性映射和任意数量的子对象。

public interface Document {
 
  Void put(String key, Object value);
 
  Object get(String key);
 
  <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor);
}
 
public abstract class AbstractDocument implements Document {
 
  private final Map<String, Object> properties;
 
  protected AbstractDocument(Map<String, Object> properties) {
    Objects.requireNonNull(properties, "properties map is required");
    this.properties = properties;
  }
 
  @Override
  public Void put(String key, Object value) {
    properties.put(key, value);
    return null;
  }
 
  @Override
  public Object get(String key) {
    return properties.get(key);
  }
 
  @Override
  public <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) {
    return Stream.ofNullable(get(key))
        .filter(Objects::nonNull)
        .map(el -> (List<Map<String, Object>>) el)
        .findAny()
        .stream()
        .flatMap(Collection::stream)
        .map(constructor);
  }
  ...
}


接下来,我们定义一个枚举“属性”和一组类型,价格,模型和零件的接口。 这使我们能够为Car类创建静态外观的界面。

public enum Property {
 
  PARTS, TYPE, PRICE, MODEL
}
 
public interface HasType extends Document {
 
  default Optional<String> getType() {
    return Optional.ofNullable((String) get(Property.TYPE.toString()));
  }
}
 
public interface HasPrice extends Document {
 
  default Optional<Number> getPrice() {
    return Optional.ofNullable((Number) get(Property.PRICE.toString()));
  }
}
public interface HasModel extends Document {
 
  default Optional<String> getModel() {
    return Optional.ofNullable((String) get(Property.MODEL.toString()));
  }
}
 
public interface HasParts extends Document {
 
  default Stream<Part> getParts() {
    return children(Property.PARTS.toString(), Part::new);
  }
}


我们准备介绍Car

public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {
 
  public Car(Map<String, Object> properties) {
    super(properties);
  }
}


完整示例中的Car构造和使用方式。

    LOGGER.info("Constructing parts and car");
 
    var wheelProperties = Map.of(
        Property.TYPE.toString(), "wheel",
        Property.MODEL.toString(), "15C",
        Property.PRICE.toString(), 100L);
 
    var doorProperties = Map.of(
        Property.TYPE.toString(), "door",
        Property.MODEL.toString(), "Lambo",
        Property.PRICE.toString(), 300L);
 
    var carProperties = Map.of(
        Property.MODEL.toString(), "300SL",
        Property.PRICE.toString(), 10000L,
        Property.PARTS.toString(), List.of(wheelProperties, doorProperties));
 
    var car = new Car(carProperties);
 
    LOGGER.info("Here is our car:");
    LOGGER.info("-> model: {}", car.getModel().orElseThrow());
    LOGGER.info("-> price: {}", car.getPrice().orElseThrow());
    LOGGER.info("-> parts: ");
    car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}",
        p.getType().orElse(null),
        p.getModel().orElse(null),
        p.getPrice().orElse(null))
    );
 
    // Constructing parts and car
    // Here is our car:
    // model: 300SL
    // price: 10000
    // parts: 
    // wheel/15C/100
    // door/Lambo/300


🔍 类图

8e945deb4c9f4fadaa256e15629347ba.png


🔍 适用性


使用抽象文档模式当

  • 需要即时添加新属性
  • 你想要一种灵活的方式来以树状结构组织域
  • 你想要更宽松的耦合系统

5ff60e89324042e3a1f29fbe59cffc14.gif

相关文章
|
16小时前
|
设计模式 开发框架 Java
java设计模式面试题大全含答案
java设计模式面试题大全含答案
|
1天前
|
设计模式 Java 机器人
Java设计模式之工厂模式最详解
Java设计模式之工厂模式最详解
|
1天前
|
设计模式 安全 Java
Java设计模式之单例模式详解
Java设计模式之单例模式详解
|
1天前
|
设计模式 Java 机器人
Java设计模式之工厂方法模式详解
Java设计模式之工厂方法模式详解
|
1天前
|
设计模式 Java 机器人
Java设计模式之抽象工厂模式详解
Java设计模式之抽象工厂模式详解
|
1天前
|
设计模式 Java Spring
java设计模式总结
java设计模式总结
|
1天前
|
设计模式 监控 安全
屏幕监控软件的设计模式:深入理解Java EE
在Java EE环境中,屏幕监控软件采用生产者-消费者设计模式,`ScreenCaptureProducer`类捕获屏幕数据并放入队列,`ScreenCaptureConsumer`负责处理和提交。数据每5分钟通过定时任务和RESTful API自动提交至网站,提升管理效率。该方案支持实时监控、数据分析和高效的数据处理。
13 2
|
7天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
9 1
|
22天前
|
设计模式 存储 前端开发
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用
|
22天前
|
存储 前端开发 Java
Java一分钟之-Java GUI设计原则与模式
本文介绍了Java GUI开发的核心设计原则和模式,包括分层架构(MVC)、组件复用、用户体验和代码示例。强调了MVC模式以提高代码可维护性,组件化设计以增强复用性,以及响应式和简洁界面以提升用户体验。同时,提出了常见问题的避免策略,如布局管理、资源释放和国际化支持,建议开发者遵循这些原则以提升GUI应用质量。
68 3