- 1直白的理解State模式,直接撸代码
这里的业务就是根据订单的来源不同,来计算订单的配送运费。
这里用State模式来做,一种 自己官网的普通订单State,一种 三方合作的订单State,做两个State类
/// <summary>
/// 普通订单
/// </summary>
public class GeneralOrder : Order
{
/// <summary>
/// 计算订单的价钱
/// </summary>
public override void ComputePrice()
{
//nothing to do
}
}
/// <summary>
/// 三方订单
/// </summary>
public class CooperantOrder : Order
{
/// <summary>
/// 计算订单价钱
/// </summary>
/// <returns></returns>
public override void ComputePrice()
{
if (orderPrice > 99)
{
deliveryCost = 0;
}
else
{
deliveryCost = OrderDeliveryCost;
orderPrice += OrderDeliveryCost;
}
}
}
/// <summary>
/// 订单
/// </summary>
public abstract class Order
{
protected readonly decimal OrderPriceFreeDeliveryCost = 99;
protected readonly decimal OrderDeliveryCost = 5;
protected IExpress express;
protected decimal deliveryCost;
protected decimal orderPrice;
public decimal OrderPrice { get { return orderPrice; } }
/// <summary>
/// 运费
/// </summary>
public decimal DeliveryCost
{
get { return deliveryCost; }
}
public Order(IExpress express)
{
this.express = express;
}
public abstract void ComputePrice();
/// <summary>
/// 设定快递派送
/// </summary>
/// <returns>设定结果</returns>
public virtual bool SetDeliveryWay()
{
var handlerResult= express.HandlerCustomerOrder(this);
if (!handlerResult)
throw new Exception("订单没有快递公司进行配送了");
else
this.ComputePrice();
return handlerResult;
}
}
/// <summary>
/// 快递公司
/// </summary>
public interface IExpress
{
bool HandlerCustomerOrder(Order order);
}
总结:
State模式就是用State类来替换 if ……lese ……的操作,因为类中直接调用方法了,不会存在if……else……