装饰图案部分

时间:2019-02-14 09:20:17

标签: java spring spring-boot design-patterns decorator

这是特定于Spring Boot的面向对象的设计问题。我正在扩展一个Spring Boot应用程序,该应用程序具有正在扩展并在另一个服务中使用的接口。该接口使用依赖项注入来选择实现。我不想改变那个。我认为继承设计对于Spring Boot来说是不错的选择,但是该接口并没有为我的实现提供必要的方法。我是否正在考虑装饰器模式,并在另一个界面中进行混合。要扩展的接口是...

public interface DataStrategyService {

    DataRecord getEntityByPK(DataRecord dataRecord);

    DataRecord getEntityByBK(DataRecord dataRecord);

    void overwriteEntityByPK(DataRecord dataRecord);

    void saveEntity(DataRecord dataRecord);

}

已经有一个已经可以实现的实现,并且对于这样的接口很有意义……

@Service
@ConditionalOnProperty(name="data.strategy", havingValue="KAFKA")
public class KafkaDataStrategyService implements DataStrategyService {
        DataRecord getEntityByPK(DataRecord dataRecord{
          //implementation stuff
        }

        DataRecord getEntityByBK(DataRecord dataRecord){
          //implementation stuff
        }

        void overwriteEntityByPK(DataRecord dataRecord){
          //implementation stuff
        }

        void saveEntity(DataRecord dataRecord){
          //implementation stuff
        }
}

但是该接口并没有提供我正在执行的实现所需的内容,因此我将像这样混合使用另一个Decorator ...

@Component
@ConditionalOnProperty(name="data.strategy", havingValue="CASSANDRA")
public interface ColumnFamilyDataStrategyDecorator {
    Map<String, Object> insertEntity(DataRecord dataRecord);
    Map<String, Object> deleteEntity(DataRecord dataRecord);
}

和将使用装饰器的类的具体类是...

@Service
@ConditionalOnProperty(name="data.strategy", havingValue="CASSANDRA")
public class ColumnFamilyDataStrategyService implements DataStrategyService, ColumnFamilyDataStrategyDecorator {
  Map<String, Object> insertEntity(DataRecord dataRecord){
      //implementation
  }

  Map<String, Object> deleteEntity(DataRecord dataRecord){
      //implementation
  }

  DataRecord getEntityByPK(DataRecord dataRecord{
      throw new UnsupportedOperationException("ColumnFamilyDataStrategyService.getEntityByPK() currently not supported.");
  }

  DataRecord getEntityByBK(DataRecord dataRecord){
      throw new UnsupportedOperationException("ColumnFamilyDataStrategyService.getEntityByBK() currently not supported.");
  }

  void overwriteEntityByPK(DataRecord dataRecord){
      throw new UnsupportedOperationException("ColumnFamilyDataStrategyService.overwriteEntityByPK() currently not supported.");
  }

  void saveEntity(DataRecord dataRecord){
      throw new UnsupportedOperationException("ColumnFamilyDataStrategyService.saveEntity() currently not supported.");
  }
}

如您所见,这里有一些UnsupportedOperationException被抛出。看起来有点乱。但是,我真的不希望将Adapter模式与委托一起使用,因为那样我将无法按照作者的意图使用Spring依赖项注入。但另一方面,这些异常看起来很混乱。有什么建议吗?

0 个答案:

没有答案