某大型购物中心欲开发一套收银软件,要求其能够支持购物中心在不同时期推出的各种促销活动,如打折、返利(例如,满300返100)等等。现采用策略(Strategy)模式实现该要求,得到如图6-1所示的类图。
图6-1策略模式类图
【Java代码】
import java.util.*;
enum TYPE{NORMAL,CASH_DISCOUNT,CASH_RETURN};
interface CashSuper{
public(1);
}
class CashNormal implements CashSuper{//正常收费子类
public double acceptCash(double money){
return money;
}
}
class CashDiscount implements CashSuper{
private double moneyDiscount;//折扣率
public CashDiscount(double moneyDiscount){
this moneyDiscount=moneyDiscount;
}
public double acceptCash(double money){
return money*moneyDiscount;
}
}
class CashReturn implements CashSuper{//满额返利
private double moneyCondition;
private double moneyReturn;
public CashReturn(double moneyCondition,double moneyReturn){
this.moneyCondition=moneyCondition;//满额数额
this.moneyReturn=moneyReturn;//返利数额
}
public double acceptCash(double money){
double result=money;
if(money>=moneyCondition)
result=money-Math.floor(money/moneyCondition)*moneyReturn;
return result;
}
}
class CashContext_{
private CashSuper cs;
private TYPE?t;
public CashContext(TYPE t){
switch(t){
case NORMAL://正常收费
(2);
break;
case CASH_DISCOUNT://打8折
(3);
break;
case CASH_RETURN://满300返100
(4);
break;
}
}
public double GetResult(double money){
(5);
}
//此处略去main( )函数
}
(1)double acceptCash(double money)
(2)cs=new CashNormal()
(3)cs=new CashDiscount(0.8)
(4)cs=new CashReturn(300,100)
(5)return cs.acceptCash(money)
本题考查策略(Strategy)模式的基本概念和应用。
Strategy模式的设计意图是,定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化,其结构图如下图所示。
?Strategy(策略)定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
?ConcreteStrategy(具体策略)以Strategy接口实现某具体算法。
?Context(上下文)用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口来让Strategy访问它的数据。
Strategy模式适用于:
?许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
?需要使用一个算法的不同变体。例如,定义一些反应不同空间的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式。
?算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语旬的形式出现,将相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。
本题中类CashSuper对应于上图中的类Strategy,类CashNormal、CashDiscout和CashReturn分别代表3种不同的具体促销策略。CashSuper是父类接口,提供其3个子类的公共操作接口,由子类给出3种不同促销策略的具体实现。从3个子类CashNormal、CashDiscout和CashReturn的代码可以看出,公共操作方法为double acceptCash(double money)。由于不需要父类CashSuper提供任何的促销实现方式,在接口CashSuper中double acceptCash(double money)方式是没有具体实现内容的。应填入空(1)处的语句是"double acceptCash(double money)"。
空(2)-(4)都出现在类CashContext中,该类对应于上图中的类Context,其作用是依据策略对象来调用不同的策略算法。因此空(2)-(4)的是根据不同的case分支来创建不同的策略对象。由此可知空(2)-(4)分别应填入"cs=newCashNormal()"、"cs=new CashDiscount(0.8)"和"cs=new CashReturn(300,100)"。
方法GetResult是对接口的调用,从而计算出来用不同促销策略之后应付的费用,这里需要通过CashSuper的对象cs来调用公共操作接口,因此第(5)空应填入"return cs.acceptCash(money)"。
( )is the process of transforming information so it is unintelligible to anyone but the intended recipient.
As each application module is completed,it undergoes( )to ensure that it operates correctly and reliably.
( )algorithm specifies the way to arrange data in a particular order.
After analyzing the source code,( )generates machine instructions that will carry out the meaning of the program at a later time.
( )can help organizations to better understand the information contained within the data and will also help identify the data that is most important to the business and future business decisions.
浏览器开启无痕浏览模式后,( )依然会被保存下来。
下列协议中,不属于TCP/IP协议簇的是( )。
下列传输介质中,带宽最宽、抗干扰能力最强的是( )。
数控编程常需要用参数来描述需要加工的零件的图形。在平面坐标系内,确定一个点需要2个独立的参数,确定一个正方形需要( )个独立的参数。
某书的页码为1,2,3,...,共用数字900个(一个多位数页码包含多个数字),据此可以推断,该书最大的页码为( )。