如何有效地使用OOP实现接口以显示不同的输出格式

时间:2018-03-12 11:55:19

标签: java oop interface

我必须在java应用程序中实现输出显示模块。它有三种输出格式,HTML,CSV和.txt。

输入格式有两种类型: ArrayListHashMap

我必须有效地使用OOPS实现这一点,并为每种类型的输出功能定义接口。我想知道是否有更好的方法来实现这一点。

到目前为止我尝试过的伪代码是:

OutputDisplayInterface 
{

 public void TextDisplay();
 public void CSVDisplay();
 public void HTMLDisplay();
}

TextDisplayInterface
{
public void maptotext();
public void listtotext();
}
TextDisplayClass implements TextDisplayInterface{
  \\method implementations
}
CSVDisplayInterface
{
 public void maptocsv();
 public void arraylisttocsv();

}
 CSVDisplayClass implements CSVDisplayInterface{
  \\method implementations
}
HTMLDisplayInterface
{
public void maptoHTML();
public void arraylisttoHTML();

}
HTMLDisplayClass implements HTMLDisplayInterface{
  \\method implementations
}
OutputDisplayClass implements OutputDisplayInterface
{
 public void TextDisplay(){
 TextDisplay t = new TextDisplayClass();
 t.maptotext();
 t.listtotext();

}

public void CSVDisplay(){
CSVDisplay t = new TextDisplayClass();
t.maptocsv();
t.listtocsv();

}
 ....
}

如果我在main函数中调用TextDisplay(),将调用方法maptotext()listtotext(),实际上我只希望其中一个按照输入数据执行类型(即hashmaplist)。

2 个答案:

答案 0 :(得分:0)

我从多态性的角度回答:

OutputDisplayInterface 
{
 public void TextDisplay();
 public void CSVDisplay();
 public void HTMLDisplay();
}

我不认为上述内容有用,因为显示textcsvhtml是不同的实现。你不会用这个来实现多态性。我会建议下面(伪代码)(我假设输入将被传入。)

这是任何展示元素的合约。它采用显示方法,采用ListMap

DisplayInterface {
    display(ArrayList list); //Or just List to be better
    display(HashMap map);  //Or just Map to be better
}

上面有三种实现

TextDisplay {
    display(ArrayList list) {..}
    display(HashMap map) {..}
}
CSVDisplay {
    display(ArrayList list) {..}
    display(HashMap map) {..}
}
HTMLDisplay {
    display(ArrayList list) {..}
    display(HashMap map) {..}
}

注意:应避免使用List等原始类型,ArrayList。根据您的用例使用泛型类型。

<强>用法:

DisplayInterface displayInterface = new TextDisplay();
displayInterface.display(list); //This invokes the method that takes a list.
//OR
displayInterface.display(map);  //This invokes the method that takes a map.

答案 1 :(得分:0)

我会做这样的事情:

interface Output {
    String text();
}

interface HtmlListOutput implements Output {

    private final ArrayList list;

    //ctor

    @Override
    public String text() {
        //list to html text
    }

}

interface HtmlMapOutput implements Output {

    private final HashMap map;

    //ctor

    @Override
    public String text() {
        //map to html text
    }

}

//proxy/delegate class
class HtmlOutput implements Output {

    private Output origin;

    public HtmlOutput(ArrayList list) {
        this.origin = new HtmlListText(list);
    }

    public HtmlOutput(HashMap map) {
        this.origin = new HtmlMapText(map);
    }

    @Override
    public String text() {
        return origin.text();
    }

}

与CSV和.txt相同。