规则接口:
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();
}
}