这是我遇到的一个设计难题......
在我的程序中,我有不同类型的条目 - 数字,文本,日期,图像等。
我的第一个想法是让模型以这样的继承结构:
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: ..
}
}
}
但这在我看来太有线了,不是吗? 在描述的场景中什么是正确的方法?
答案 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()