我正在研究如何构建一个复杂的模块化系统,其中包含订单、客户、项目和报价。
客户可以有多个项目。对于每个项目,至少会有一个订单或报价相关联,但是有可能在每个属于客户的项目上有多个报价和订单。在软件需求中,如果不与项目挂钩,就不可能有报价或订单。
我遇到的问题是如何在这个系统周围创建类。如果Customer类具有包含所有项的Projects、Orders和Quotes属性,这是错误的。似乎应该对Customers类进行一些扩展,比如如何添加这些项,而不是将其硬编码为属性。是否有我可以使用的设计模式,例如装饰模式?
发布于 2017-12-03 10:30:54
当然,对于当前的需求,不需要继承或基于继承的设计模式。我们可以立即创建类Customer、Project、Order和Quote。我们需要仔细地确定它们之间的关系,以便我们可以决定放置属性和方法。
您刚才提到Customer可以有多个Projects,所以Customer类有Lis<Project>和addProject(Project)方法。
public class Customer {
private List<Project> projects;
public void addProject(Project project) {
projects.add(project);
}
}同样,Project应该包含一个List<Quote>和List<Order>来存储引号和订单。但是,add***()方法必须设计得稍微复杂一些。
让我们看看Quote和Order。您的软件需求表明,如果不绑定到Quote或Order,就不可能存在Project。因此,您需要一个Quote和Order中的构造函数,它接受Project实例。这里有几件事值得注意。
Quote或Order添加到Project类中。正确的位置是Quote或Order的构造函数。公共类引用{私有项目项目;公共引用(项目项目){ Project = p;project.addQuote(this);}公共类顺序{私有项目项目;公共秩序(项目项目){ project = p;project.addOrder(this);}}Project类(静态内部类)中。您可以在Menu和MenuItems、Tab和TabItems等中看到这种模式,其中MenuItems和TabItems在不绑定到Menu或Tab的情况下是不存在的。另一个例子是Iterator和List。add***()将成为返回实例的封闭类中的工厂方法。公共类项目{私有List报价;私有List订单;公共引号addQuote(int id) { quote addQuote=新引号(此,id);quotes.add(报价);返回报价;}公共秩序addOrder(int id) { Order =新秩序(此,id);orders.add( Order );返回顺序;} public静态类Quote {私有最终int id;私有最终项目项目;私有引用(项目项目,int id) { project = p;this.id = id;}公共静态类顺序{私有最后int id;私有最终项目;私有订单(项目项目,int id) { project = p;this.id = id;}}根据需要可以改变addQuote()和addOrder()的参数。
现在要解决的最后一个问题是,在一个Quote或order中至少应该有一个Project。我们可以通过在Project中使用静态工厂方法来解决这个问题。
public class Project {
// Fields
private Project() {
// Initialise the fields
}
public static Project createWithQuote(int id) {
Project p = new Project();
p.addQuote(id);
return p;
}
public static Project createWithQuotes(int[] ids) {
Project p = new Project();
for (int id : ids)
p.addQuote(id);
return p;
}
// Add similar static factories for Order
// Rest of the code
}私有构造函数和静态工厂提高了可读性,避免了构造函数重载冲突。如果您愿意,您也可以使用公共重载构造函数。如果要子类,则使构造函数受到保护。
发布于 2017-12-02 22:21:49
由于您关注的是对象(主要是数据)与它们的基数之间的关系,这听起来更像是关系数据库问题。
如果使用现有约束设计一个良好的数据库,则可以使用现代IDE从数据库自动创建代码。
查看以下链接,了解从现有数据库结构创建普通旧(java)对象的自动化方法可能非常有益:
Java 6-在实验室OTN开发者日,使用虚拟机。
https://softwareengineering.stackexchange.com/questions/360866
复制相似问题