组合模式在这种情况下是不错的选择?

时间:2017-01-06 12:11:30

标签: java android oop design-patterns

这是我遇到的一个设计难题......

在我的程序中,我有不同类型的条目 - 数字,文本,日期,图像等。

我的第一个想法是让模型以这样的继承结构:

Entry 
    -- NumericEntry (extends Entry)
    -- TextualEntry (extends Entry)
    -- DateEntry (extends Entry)
    -- ImageEntry (extends Entry)

然后我可以有一个Entry对象列表,每个对象都知道如何处理&通过公共成员(即showData(),makeSummary()等)公开其数据。如果我想添加新的Entry对象,我将添加另一个具有该特定类型的类。

但是,java限制以及android orm库的限制使得这非常复杂。

所以,我已经转向复合模式,但我不确定我是否正确接近它。

所以,现在我有了这个(伪代码):

 class Entry
    {
    Type type;
    (nullable)NumericEntry  numericEntry;
    (nullable)TextualEntry textualEntry;
    (nullable)DateEntry dateEntry;
    (nullable)ImageEntry imageEntry;

    public showData() 
    { 
        swicth (type) 
        {
          case numeric: ..
          case textual: ..
          case date: ..
          case image: ..
         }
    }
}

但这在我看来太有线了,不是吗? 在描述的场景中什么是正确的方法?

2 个答案:

答案 0 :(得分:2)

我认为你要做的事情是合法的,但我认为这里的复合模式有点偏。据我所知,复合模式更适用于层次结构(如目录结构)。

你的模型似乎很好,使用(抽象)基类,并让其他类型从它扩展,但是我不明白你为什么要在你的基类Entry类中拥有所有不同类型的条目。

如果我理解你想要什么,那么这将更合乎逻辑。

接口示例:

public interface Entry{
    // Define all your methods as abstract and define them here
    void showData();
}

public class TextualEntry implements Entry{
     void showData(){
         // Your implementation for textual entries here
     }
}
// Repeat this for the other types of entries

您还可以考虑一个抽象类实现,它可以定义所有扩展类中使用的属性/字段。此外,您可以在抽象类中实现对所有扩展类具有相同实现的方法。

抽象类示例:

abstract class Entry{
    // Define your properties here that are used in all the other classes

    // Define all your methods as abstract and define them here
    public abstract void showData();
}

class TextualEntry extends Entry{
     // Define new properties here

     public override void showData(){
         // Your implementation for textual entries here
     }
}
// Repeat this for the other types of entries

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html,他们讨论了类似的问题。

答案 1 :(得分:1)

如果我理解你的请求你可以使用Composite,但我没有得到你如何使用伪代码。

Composite模式将对象组合成树结构以表示部分整体层次结构。对象组的处理方式与对象的单个实例相同。

组件接口定义了叶子和组合的常用方法/方法。

Leaf实现了Component接口,但catch是你可以拥有多个叶子对象(数字,文本,......)。

Composite实现了Component接口,但它也是leaf对象的容器。

所以用法可以是:

Component leaf1 = new Leaf(); //numeric entry
Component leaf2 = new Leaf(); // text entry

Composite composite = new Composite();
composite.add(leaf1);
composite.add(leaf2);

composite.operation(); // showData()