来自维基百科的介绍——

面向对象的结构

抽象文档模式的适用性和特点

需要动态添加新属性时而不影响组织结构,类属性变化频率较大

想要一种灵活的方式来组织树状结构中的域

想要更松散耦合的系统

通过集合存储属性

建立属性表统一维护类的属性

通过接口来配置获取和添加属性的方式

实例

1.抽象出基类,提供存储属性的集合。

2.通过接口定义存储和获取的方法

代码示例类图

HasType 类型属性

HasPrice 价格属性

HasColor 颜色属性

HasSize 尺码属性

HasSeason 季节属性

HasClothes 用于关联下级映射关系

Goods 商品父接口

Hat 帽子实体

Clothes 衣服实体

Costume 服饰实体,实现HasClothes即可设置Clothes相关属性

/**

* 衣服类别

*/

public interface HasClothes extends Goods {

String PROPERTY = "clothes";

default Stream getClothes() {

return children(PROPERTY, Clothes::new);

}

}

/**

* 颜色属性

*/

public interface HasColor extends Goods {

String PROPERTY = "color";

default Optional getColor() {

return Optional.ofNullable((String) get(PROPERTY));

}

}

/**

* 价格属性

*/

public interface HasPrice extends Goods {

String PROPERTY = "price";

default Optional getPrice() {

return Optional.ofNullable((String) get(PROPERTY));

}

}

/**

* 季节属性

*/

public interface HasSeason extends Goods {

String PROPERTY = "season";

default Optional getSeason() {

return Optional.ofNullable((String) get(PROPERTY));

}

}

/**

* 尺码属性

*/

public interface HasSize extends Goods {

String PROPERTY = "size";

default Optional getSize() {

return Optional.ofNullable((String) get(PROPERTY));

}

}

/**

* 类型属性

*/

public interface HasType extends Goods {

String PROPERTY = "type";

default Optional getType() {

return Optional.ofNullable((String) get(PROPERTY));

}

}

/**

* 商品接口的抽象实现

*/

public abstract class AbstractGoods implements com.company.base.Goods {

private final Map properties;

protected AbstractGoods(Map properties) {

// JDK工具类,是一些静态方法组成,主要用于操作对象、计算对象的哈希码,返回对象的字符串和比较两个对象

Objects.requireNonNull(properties, "properties map is required");

this.properties = properties;

}

@Override

public Object get(String key) {

return properties.get(key);

}

@Override

public void put(String key, Object value) {

properties.put(key, value);

}

@Override

public Stream children(String key, Function, T> constructor) {

Optional>> any = Stream.of(get(key)).filter(el -> el != null).map(el -> (List>) el).findAny();

return any.isPresent() ? any.get().stream().map(constructor) : Stream.empty();

}

}

/**

* 商品的超级接口

*/

public interface Goods {

void put(String key, Object value);

Object get(String key);

Stream children(String key, Function, T> constructor);

}

/**

* 衣服的实体类

*/

public class Clothes extends AbstractGoods implements HasPrice, HasColor, HasType, HasSize {

public Clothes(Map properties) {

super(properties);

}

}

/**

* 服饰的实体

*/

public class Costume extends AbstractGoods implements HasSeason, HasClothes{

public Costume(Map properties) {

super(properties);

}

}

/**

* 帽子的实体类

*/

public class Hat extends AbstractGoods implements HasPrice, HasColor, HasType, HasSize {

public Hat(Map properties) {

super(properties);

}

}

/**

* 一种面向对象的结构设计模式,用于在松散类型的键值存储中组织对象并使用类型化视图公开数据。

* 该模式的目的是在强类型语言中实现组件之间的高度灵活性,其中可以动态地将新属性添加到对象

* 树,而不会失去对类型安全的支持。该模式利用特征将类的不同属性分成不同的接口

*/

public class App {

private static final Logger LOGGER = LoggerFactory.getLogger(App.class);

public App() {

Map clothesProperties = new HashMap<>();

clothesProperties.put(HasSize.PROPERTY, "XXL");

clothesProperties.put(HasPrice.PROPERTY, "399元");

clothesProperties.put(HasColor.PROPERTY, "棕色带图案");

clothesProperties.put(HasType.PROPERTY, "男士上衣");

Map clothes1Properties = new HashMap<>();

clothes1Properties.put(HasSize.PROPERTY, "中号");

clothes1Properties.put(HasPrice.PROPERTY, "188元");

clothes1Properties.put(HasColor.PROPERTY, "黑色");

clothes1Properties.put(HasType.PROPERTY, "鸭舌帽");

Map costumeProperties = new HashMap<>();

costumeProperties.put(HasSeason.PROPERTY, "春季新款");

costumeProperties.put(HasClothes.PROPERTY,

Arrays.asList(clothesProperties, clothes1Properties));

com.company.Costume costume = new com.company.Costume(costumeProperties);

LOGGER.debug("季节上新:");

LOGGER.debug("-------------------------");

LOGGER.debug("--> 季节: {}", costume.getSeason().get());

LOGGER.debug("--> 明细: ");

costume.getClothes().forEach(clothes -> LOGGER.debug("-->\t {}/{}/{}/{}",

clothes.getPrice().get(), clothes.getColor().get(),

clothes.getSize().get(), clothes.getType().get()));

}

public static void main(String[] args) {

new App();

}

}

执行结果

总结

所有的属性都通过Map存储。所以存储的时候不需要关心具体的类型是什么。

对象可以有子对象。比如,Costume有Hat,Clothes。Hat和Clothes都是子对象。通过Costume可以获得Hat和Clothes子对象,通过子对象设置和获取子对象的属性。

通过继承接口,实现获取类型相关的属性。Costume继承并实现接口HasSeason。如果想获得 Costume的season属性,需要调用getSeason().get()。从而实现取出的属性类型相关。

通过基类封装基本操作。这样不同Costume或者Costume和Hat、Clothes之间可以共享实现。

java 抽象属性 设计_设计模式之抽象文档模式相关推荐

  1. java word 颜色设置_如何为Word文档在Java中的背景颜色

    展开全部 用第三方吧,比较方便,参考下Free Spire.Doc for Java的方法,这个是免费版,直接用可以了.62616964757a686964616fe58685e5aeb9313334 ...

  2. java 设置word权限_如何设置word文档的修改权限

    若文档允许被其他人查看,但不允许被其他人修改,可以为文档设置修改权限.接下来小白办公网就来详细介绍一下word权限的修改方法. 如何设置word文档的修改权限 步骤01 限制编辑 打开原始文件,切换到 ...

  3. 软件设计一点通 | 抽象文档模式详解

    抽象文档模式 抽象文档模式是什么 一种面向对象的结构设计模式,用于在松散类型的键值存储中组织对象并使用类型化视图公开数据.该模式的目的是在强类型语言中实现组件之间的高度灵活性,其中可以动态地将新属性添 ...

  4. java毕业论文_【毕业论文】基于java的博客网站设计与开发毕业论文(word文档)

    <[毕业论文]基于java的博客网站设计与开发毕业论文.doc>由会员分享,可免费在线阅读全文,更多与<[毕业论文]基于java的博客网站设计与开发毕业论文(word文档)>相 ...

  5. java计算机毕业设计科大学生党员之家设计源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计科大学生党员之家设计源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计科大学生党员之家设计源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构 ...

  6. JAVA毕业设计购物网站设计计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计购物网站设计计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计购物网站设计计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...

  7. JAVA毕业设计Web美食网站设计计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计Web美食网站设计计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计Web美食网站设计计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开 ...

  8. java计算机毕业设计旅游网站设计源代码+数据库+系统+lw文档

    java计算机毕业设计旅游网站设计源代码+数据库+系统+lw文档 java计算机毕业设计旅游网站设计源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软 ...

  9. java计算机毕业设计食用菌菌棒溯源系统的开发与设计源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计食用菌菌棒溯源系统的开发与设计源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计食用菌菌棒溯源系统的开发与设计源程序+mysql+系统+lw文档+远程调试 本源 ...

  10. JAVA毕业设计H5醉美南湾湖网站设计计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计H5醉美南湾湖网站设计计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计H5醉美南湾湖网站设计计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S ...

最新文章

  1. python bottle web框架简介
  2. win 下squid的配置
  3. CSS三角形如何工作?
  4. Linux系统管理技术
  5. PhoneGap 1.5版本 cordova.js 简析 3(转)
  6. [转]Chrome 控制台console的用法
  7. MySQL表名不区分大小写的设置方法
  8. golang中的defer
  9. 逆天Kali带你游遍大江南北~安全之前人铺路!
  10. 一、开始动手开发网球平台
  11. 树莓派教程 - 2.2 树莓派CSI摄像头,raspivid、raspistill常用参数
  12. 权限管理----用户与模块关系
  13. 诺基亚HERE地图套件重返Windows应用商店
  14. 工程师素质拓展课程主页(2012级)
  15. timesat数据如何读取_【续篇】如何通过HART协议将流量计实时数据读取到上位机(文末有彩蛋)...
  16. 测试网站速度的8款免费工具推荐
  17. 黑市最流行的黑客匿名工具
  18. 呼叫系统管理服务器图片,电话呼叫中心系统架构,电话呼叫系统软件
  19. PDF转成Word或PPT后还是图片是怎么回事?
  20. 06年注册安全工程师试题

热门文章

  1. 感受吴军博士的见识(一)
  2. android sim卡pin,如何设置手机的SIM卡的PIN码?
  3. Android中英文切换
  4. Word2016 页码从任意页开始
  5. 阵列卡在服务器什么位置,阵列卡是什么
  6. 我读过关于面试最好的一篇文章
  7. html5 指南针,14.html5 作业 简单移动端-指南针 用 canvas 画一下.
  8. 张一鸣宣布卸任字节跳动CEO,联合创始人梁汝波将接任
  9. Win10完美运行红色警戒2的安装包和补丁_我是亲民_新浪博客
  10. windows家庭中文版升级至专业版