订购软件的设计思路

08-06-24 r7raul
需求:ISV有一个软件,用户要订购此软件

if(软件是否是月租型)

{

直接开通 //是月租

}

else

{

if(是新订还是续订)

{//是新订

if(是否免费)

{ //免费

直接开通

}

else

{ //不是免费

执行新订流程

}

}

else

{

if(软件是否到期)

{ //到期

执行到期续订

}

else

{ //没到期

执行未到期续订

}

}

}

r7raul
2008-06-24 14:30
从中可以提炼出

一个软件是实体

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

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

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

public boolean subscribe(Software asoftware)

{

for(循环那些已经定义了的规格实例)

{

if(符合此规格)

{

spec.subscribe(this);//this是订购服务类的实例,spec是相应规格

的实例

}

}

}

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

r7raul
2008-06-24 14:31
晕,括号没对齐。。。

banq
2008-06-25 16:28
>是否月租,是否免费,是否到期,是否新订

是状态,使用状态模式来解决,先画个状态图出来,是不是涉及不同部门权限操作等等。

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

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


pub
2008-06-27 09:26
关于规则可以用职责链吧?

pub
2008-06-27 09:35
===是否月租,是否免费,是否到期,是否新订我设计为值对象

我发表下我的意见

因为是否月租 是否不是月租

是否免费 是否收费

是否到期 是否未到期 分别为不同的状态机

而你放在一起去考虑了。这个思路就到了C的时代。 就算用上值对象也只是多加了一个概念

旧酒新瓶了。

状态这一块还得抽取 少点IF。多点对象。。。

看是群中的兄弟的贴 胡乱说几句 呵。

bosslee
2008-07-23 11:38
是否月租,是否免费,是否到期

是否可以说得详细点,

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

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

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

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

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

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

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

freebox
2008-07-26 01:13
规则接口:

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();
}
<p>

购买方案接口:

public interface Buy {
	public void buy();
}
<p>

各规则:

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);
		}
	}
}
<p>

各购买方案:

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("去新办手续吧");
	}
}
<p>

购买方案选择:

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) {}
<p>

软件:

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

测试:

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

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

bosslee
2008-07-30 01:01
请问,那免费的软件有些什么样的阿?

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

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

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

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

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

OrderApplication

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

void rented(月租型软件):

void toBuy(非租用软件):

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

r7raul
2008-08-04 16:59
免费体验期的第一个月就是公测期

猜你喜欢