订购软件的设计思路

需求:ISV有一个软件,用户要订购此软件
if(软件是否是月租型)
{
直接开通 //是月租
}
else
{
if(是新订还是续订)
{//是新订

if(是否免费)
{ //免费
直接开通

}
else
{ //不是免费
执行新订流程
}


}
else
{

if(软件是否到期)
{ //到期

执行到期续订
}
else
{ //没到期
执行未到期续订
}

}
}

从中可以提炼出


一个软件是实体


是否月租,是否免费,是否到期,是否新订我设计为值对象,比如月租型可以设计为只有两个实例 一个是月租,一个不是月租,其它的以此类推


对于那些逻辑判断,我先设计个抽象规格,然后把那些规则判断定位其子类,每个子类中都有subscribe方法,参数是订购服务的实例,其中执行订购服务类中对应于相应规格的订购方法


接下去是设计订购服务中先定义一个 总的订购方法,例如


public boolean subscribe(Software asoftware)
{
for(循环那些已经定义了的规格实例)
{
if(符合此规格)
{
spec.subscribe(this);//this是订购服务类的实例,spec是相应规格
的实例
}

}

}
接着定义其它符合各种规格的订购方法

晕,括号没对齐。。。

>是否月租,是否免费,是否到期,是否新订
是状态,使用状态模式来解决,先画个状态图出来,是不是涉及不同部门权限操作等等。

论坛不能上传图片。。。。。用状态模式? 我要做的是一个SAAS平台,提供ISV软件的接入,那些ISV提供软件,我们要为用户提供订购功能,订购功能就根据软件的各种类型来处理。状态模式是 封装转换过程,也就是转换规则,但是此处软件订购以后状态并不改变。规约 OR 状态模式??


[该贴被admin于2008-06-25 19:38修改过]


关于规则可以用职责链吧?

===是否月租,是否免费,是否到期,是否新订我设计为值对象

我发表下我的意见
因为是否月租 是否不是月租
是否免费 是否收费
是否到期 是否未到期 分别为不同的状态机
而你放在一起去考虑了。这个思路就到了C的时代。 就算用上值对象也只是多加了一个概念
旧酒新瓶了。
状态这一块还得抽取 少点IF。多点对象。。。
看是群中的兄弟的贴 胡乱说几句 呵。

是否月租,是否免费,是否到期

是否可以说得详细点,

一个软件是否是月租的,一个软件是否是免费的,一个软件是否到期

这三个有点不一样的属性,月租和免费是,一个软件的特点,表达软件的一种方式,

但是,是否到期这个就要认真的考虑一下,到底用什么表示才能足够的表达出他的概念,


初步认为,前两者表达软件的特性,是否到期这个概念应该是状态


[该贴被bosslee于2008-07-23 11:41修改过]
[该贴被bosslee于2008-07-23 11:42修改过]
[该贴被bosslee于2008-07-23 11:43修改过]

规则接口:


public abstract class Rule {
protected Software software;

public void setSoftware(Software software) {
this.software = software;
}

public static Rule getDefault(Software software) {
MonthRule rule = new MonthRule();
rule.setSoftware(software);
return rule;
}

public abstract Buy getBuy();
}

购买方案接口:

public interface Buy {
public void buy();
}

各规则:


class NewlyRule extends Rule {
public NewlyRule(Software software){
this.software=software;
}
@Override
public Buy getBuy() {
if (software.isNewly()) {
return new FreeRule(software).getBuy();
} else {
return new DateOffRule(software).getBuy();
}
}
}
class MonthRule extends Rule {
@Override
public Buy getBuy() {
if (software.isMonth()) {
return Buys.getBuy(Buys.IMMEDIATE);
} else {
return new NewlyRule(software).getBuy();
}
}
}
class FreeRule extends Rule {
public FreeRule(Software software) {
this.software = software;
}

public Buy getBuy() {
if (software.isFree()) {
return Buys.getBuy(Buys.IMMEDIATE);
} else {
return Buys.getBuy(Buys.NEW);
}
}
}
class DateOffRule extends Rule {
public DateOffRule(Software software) {
this.software = software;
}
@Override
public Buy getBuy() {
if (software.isDateOff()) {
return Buys.getBuy(Buys.DATEOFF);
} else {
return Buys.getBuy(Buys.CONTINUE);
}
}
}

各购买方案:

public class ContinueBuy implements Buy {
public void buy() {
System.out.println("还没到期,续订吗?");
}
}
public class DateOffBuy implements Buy {
public void buy() {
System.out.println("你过期了,快续订");
}
}
public class DefaultBuy implements Buy {
public void buy() {
System.out.println("这是默认处理");
}
}
public class ImmediateBuy implements Buy {
public void buy() {
System.out.println("中奖了!直接开通!");
}
}
public class NewBuy implements Buy {
public void buy() {
System.out.println("去新办手续吧");
}
}

购买方案选择:

public static final String CONTINUE = "CONTINUE";
public static final String DATEOFF = "DATEOFF";
public static final String IMMEDIATE = "IMMEDIATE";
public static final String NEW = "NEW";

public static Buy getBuy(String type) {}

软件:

public class Software {
private boolean free;
private boolean month;
private boolean newly;
private boolean dateOff;
//get/set
}

测试:

public class TestSoftware {
@Test
public void test() {
Software software = new Software();
Rule rule = Rule.getDefault(software);
rule.getBuy().buy();
}
}

首先一个软件有收费,和免费之分,收费软件又分月租型和非月租型,月租型软件可以有公测期,和免费体验期(不收费),非月租型是指资源型软件如电话软件,名片打印软件,需要用户购买资源(如充值。。)才能使用。除资源型软件之外还有到期续订的概念。目前正在考虑,添加退订的功能。

请问,那免费的软件有些什么样的阿?

如果我要用免费的软件的话,我要对给定购系统下达什么样的命令阿?

我理解了,收费当中的租用的日软件的话,我要对定购系统说,

我要租用此软件,那么还有一种是,收费的,但是需要购买的那种,

那我要跟定购系统说我要购买此种软件。

那假如说,我的定购系统是,

OrderApplication

那现在的情况下(就是没有完全理解免费软件定购行为之前)我想只有两种方法

void rented(月租型软件):

void toBuy(非租用软件):

还有一些疑问,月租型的软件如果处于公测期的话,会有什么样的特性,跟免费体验期有什么不同

免费体验期的第一个月就是公测期