订购软件的设计思路

作者:r7raul 发表时间:2008年06月24日 14:18 回复此消息回复

原贴网址: http://www.jdon.com:8080/jivejdon/thread/34256.html
标签列表 建模案例(52)     

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

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

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


}
else
{

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

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

}
}

这个主题共有 11 回复 / 1
re:订购软件的设计思路 发表: 2008年06月24日 14:30 回复
r7raul 发表文章: 51/ 注册时间: 2008年03月10日 19:16
从中可以提炼出


一个软件是实体


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


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


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


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

}

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

re:订购软件的设计思路 发表: 2008年06月24日 14:31 回复
r7raul 发表文章: 51/ 注册时间: 2008年03月10日 19:16
晕,括号没对齐。。。

回复:订购软件的设计思路 发表: 2008年06月25日 16:28 回复
banq 发表文章: 9485/ 注册时间: 2002年08月03日 17:08
>是否月租,是否免费,是否到期,是否新订
是状态,使用状态模式来解决,先画个状态图出来,是不是涉及不同部门权限操作等等。

回复:回复:订购软件的设计思路 发表: 2008年06月25日 17:45 回复
r7raul 发表文章: 51/ 注册时间: 2008年03月10日 19:16
论坛不能上传图片。。。。。用状态模式? 我要做的是一个SAAS平台,提供ISV软件的接入,那些ISV提供软件,我们要为用户提供订购功能,订购功能就根据软件的各种类型来处理。状态模式是 封装转换过程,也就是转换规则,但是此处软件订购以后状态并不改变。规约 OR 状态模式??


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


回复:re:订购软件的设计思路 发表: 2008年06月27日 09:26 回复
pub 发表文章: 93/ 注册时间: 2008年04月13日 18:39
关于规则可以用职责链吧?

回复:回复:re:订购软件的设计思路 发表: 2008年06月27日 09:35 回复
pub 发表文章: 93/ 注册时间: 2008年04月13日 18:39
===是否月租,是否免费,是否到期,是否新订我设计为值对象

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

re:订购软件的设计思路 发表: 2008年07月23日 11:38 回复
bosslee 发表文章: 26/ 注册时间: 2007年04月27日 23:26
是否月租,是否免费,是否到期

是否可以说得详细点,

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

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

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


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


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

re:订购软件的设计思路 发表: 2008年07月26日 01:13 回复
freebox 发表文章: 279/ 注册时间: 2008年03月01日 01:08
规则接口:

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

re:订购软件的设计思路 发表: 2008年07月29日 09:51 回复
r7raul 发表文章: 51/ 注册时间: 2008年03月10日 19:16
首先一个软件有收费,和免费之分,收费软件又分月租型和非月租型,月租型软件可以有公测期,和免费体验期(不收费),非月租型是指资源型软件如电话软件,名片打印软件,需要用户购买资源(如充值。。)才能使用。除资源型软件之外还有到期续订的概念。目前正在考虑,添加退订的功能。

回复:re:订购软件的设计思路 发表: 2008年07月30日 01:01 回复
bosslee 发表文章: 26/ 注册时间: 2007年04月27日 23:26
请问,那免费的软件有些什么样的阿?

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

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

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

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

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

OrderApplication

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

void rented(月租型软件):

void toBuy(非租用软件):

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

re:订购软件的设计思路 发表: 2008年08月04日 16:59 回复
r7raul 发表文章: 51/ 注册时间: 2008年03月10日 19:16
免费体验期的第一个月就是公测期

这个主题共有 11 回复 / 1
 
上一篇: 我对软件的一点看法,请banq 下一篇: 请教下banq有关二级缓存使用上的疑问
 
查询本论坛 最热门帖子

热点Tag: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts

标签总列表


Jdon框架演示

JiveJdon3.0
源码下载

GoF设计模式

在线教程

社区精彩讨论




google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘





手机阅读 add to google add to yahoo
联系我们 | 关于我们 | RSS订阅 | 广告联系 | 网站地图
Copyright (C) 2002-2008 Jdon.com, All Rights Reserved 版权所有 上海解道计算机技术有限公司
沪ICP备05018152号 如有意见请与我们联系 Powered by JdonFramework