什么设计模式适合我的需求?

时间:2014-06-18 06:59:31

标签: java design-patterns architecture

我有以下课程:

    public class A {

    private String a;
    private Long b;
    private Date c;

    //getters, setters, constructors
}

我需要能够将其导出为具有不同模板的Excel。 例如,一个excel具有以下标头: a b c

另一个excel有以下模板: b a c

另一个模板可能如下所示: b a

设计代码的好方法是什么,以便我可以根据一个模板或另一个模板格式化A对象?我可以看一下特定的设计模式吗?

3 个答案:

答案 0 :(得分:2)

我认为你可以使用Adapter模式,你需要为不同的模板制作不同的适配器。

使用适配器绑定对象,适配器中的某些逻辑会将传递对象的值分配给要填充值的模板。

通过制作适配器,您可以在不更改现有格式的情况下制作新格式,这将使代码更易于维护和分离。

这只是一个粗略的概念,这里可以应用哪个概念,你仍然可以在其中进行许多修改。

适配器接口

public interface Adapter {

}

适配器类

public class Format2Adapter implements Adapter {

    private Long title;
    String subtitle;

    public void fillTemplate(Core c){
        title = c.getB();
    }
}

Format2Adapter类

public class Format2Adapter implements Adapter {

    private Long title;
    String subtitle;

    public void fillTemplate(Core c){
        title = c.getB();
    }
}

业务对象类

import java.util.Date;

public class Core {

    private String a;
    private Long b;
    private Date c;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public Long getB() {
        return b;
    }

    public void setB(Long b) {
        this.b = b;
    }

    public Date getC() {
        return c;
    }

    public void setC(Date c) {
        this.c = c;
    }

    // getters, setters, constructors
}

答案 1 :(得分:1)

你可以使用很多设计模式,但是,乍一看(这也是个人品味的问题),似乎Strategy设计模式非常合适。

我会做的是将所有不同的模板实现为不同的导出策略,这将实现基本接口(或扩展基类,以防有一些常见功能):

public interface ExportStrategy {
    public void export(A a);
}

子类可能实现不同的策略:

public class ABCExportStrategy {
   ...
}

public class BACExportStrategy {
   ...
}

A类,然后变为:

public class A {
    // all the code you wrote in the question body goes here ...

    public void export(ExportStrategy strategy) {
        strategy.export(this);
    }
}

或者,您可以将策略设置为A类的状态:

public class A {
    // all the code you wrote in the question body goes here ...

    private ExportStrategy strategy;

    // setter for the strategy

    public void export() {
        strategy.export(this);
    }
}

答案 2 :(得分:0)

KISS:

public class A {

  private String a;
  private Long b;
  private Date c;

  //getters, setters, constructors      

  public void ExportData(Template template){
    switch (template.type){
       case t1:
         formatT1();
         break;
       case c2: 
         formatT2();
         break;  
       default:
         defaultBehavious();
   }
}