非常艰难地看到第二个模式,书上的东西总是耐人寻味,你反复地看才会有点感觉,而且实践很重要!小弟不才,半解半懂,就急着去写代码,可能部分不是很合理,如果你发现了,请到优快云博客给我留言。
策略模式我个人感觉可能还是没有工厂模式比较经典,体现了面向对象的封装,继承及多态。而它的特点就是为了实现不同的策略而使用不用的方法,使用工厂模式生成对象。
文件包括父类:CashSuper.as,子类正常收费:CashNormal.as;打折:CashRebate.as;返现:CashReturn.as三种方式,还有一个就是收费工厂类:CashFactory.as。
有四个文本框,一个下拉框,两个按钮,flash第一帧代码如下:
//==============================================================
import flash.events.MouseEvent;
import fl.controls.ComboBox;
import flash.events.Event;
//单价
var _textPrice:Number;
//数量
var _textNum:Number;
//总计
var _textSum:Number;
//用一个字符串保存计算方式
var _method:String="正常收费";
//定义收费
var _sum:CashSuper;
//用一个数组存储下拉框选项
var myIstem:Array=new Array();
//下拉框的几个选项
for(var i:uint=0;i<3;i++){
var istem:Object=new Object();
myIstem.push(istem);
myCombox.addItem(istem);
}
//下面是具体的下拉框内容
myIstem[0].label="正常收费";
myIstem[0].data="正常收费";
myIstem[1].label="满300返100";
myIstem[1].data="满300返100";
myIstem[2].label="打8折";
myIstem[2].data="打8折";
//我要用到现金工厂来实现计算收取的钱,算是初始化吧,正常收费
_sum=CashFactory.createCashAccept(_method);
//确认按钮添加监听事件
btnConfirm.addEventListener(MouseEvent.CLICK,confirm);
//重置按钮添加重置事件
btnReset.addEventListener(MouseEvent.CLICK,reset);
//确认按钮的事件
function confirm(e:MouseEvent):void{
_textPrice=Number(textPrice.text);
_textNum=Number(textNum.text);
//用计算总数
_textSum=_sum.acceptCash(_textPrice*_textNum);
textSum.text=String(_textSum);
textDetail.text="单价是:"+_textPrice+" 数量是:"+_textNum+" "+_method+" 总计为:"+_textSum;
}
//重置的按钮的事件
function reset(e:MouseEvent):void{
textPrice.text="0";
textNum.text="0";
textSum.text="0";
textDetail.text="";
}
myCombox.addEventListener(Event.CHANGE,CashType);
//哪一种收费方式
function CashType(e:Event):void{
_method=myCombox.selectedItem.data;
_sum=CashFactory.createCashAccept(_method);
}
//==============================================================
package {
public class CashSuper {
public function acceptCash(money:Number):Number{
var tmpResult:Number=0;
return tmpResult;
}
}
}
//==============================================================
package {
public class CashNormal extends CashSuper {
override public function acceptCash(money:Number):Number {
var tmpResult:Number=money;
return tmpResult;
}
}
}
//==============================================================
package {
public class CashRebate extends CashSuper {
private var moneyRebate:Number;
public function CashRebate(moneyRebate:Number){
//初始化
this.moneyRebate=moneyRebate;
}
override public function acceptCash(money:Number):Number {
var tmpResult:Number=money*moneyRebate;
return tmpResult;
}
}
}
//==============================================================
package {
public class CashReturn extends CashSuper {
private var moneyCondition:Number;
private var moneyReturn:Number;
public function CashReturn(moneyCondition:Number,moneyReturn:Number) {
//初始化
this.moneyCondition=moneyCondition;
this.moneyReturn=moneyReturn;
}
//重新定义收钱函数
override public function acceptCash(money:Number):Number {
var tmpResult:Number=money;
if(money>=moneyCondition){
//满多少就返还
tmpResult=tmpResult-moneyReturn;
}
return tmpResult;
}
}
}
//==============================================================
package {
public class CashFactory {
public static function createCashAccept(type:String):CashSuper{
var cs:CashSuper;
switch(type){
case "正常收费" :
cs=new CashNormal;
break;
case "满300返100" :
cs=new CashReturn(300,100);
break;
case "打8折" :
cs=new CashRebate(0.8);
break;
}
return cs;
}
}
}
//==============================================================