"Modo de diseño Big Talk" Modo de fábrica simple: un ejemplo de sistema de promoción de centros comerciales

Software de cajero de tienda

Para una interfaz de caja registradora como la siguiente, si se agregan descuentos, reducciones totales y otras actividades, primero use una fábrica simple para realizarlo. Inserte la descripción de la imagen aquí
Clase abstracta de cargos en efectivo:

abstract class CashSuper
{
    
    
	public abstract double acceptCash(double money);
}

Subcategorías de carga normal:

class CashNormal:CashSuper()
{
    
    
	public override double acceptCash(double money)
	{
    
    
		return money;
	}
}

Subcategorías de tarifas de descuento:

class CashRebate:CashSuper
{
    
    
	private double moneyRebate = id;
	public CashRebate(string moneyRebate)
	{
    
    
		this.moneyRebate = double.Parse(moneyRebate);
	}
	public override double acceptCash(double money)
	{
    
    
		return money * moneyRebate;
	}
}

Subcategoría de tarifa de reembolso:

class Cashreturn:cashSuper
{
    
    
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;
	public CashReturn(string moneyCondition,string moneyReturn)
	{
    
    
		this.moneyCondition = double.Parse(moneyCondition);
		this.moneyReturn = double.Parse(moneyReturn);
	}
	public override double acceptCash(double money)
	{
    
    
		double return = money;
		if(money >= moneyCondition)
			result = money - Math.Floor(money / moneyCondition) * moneyReturn;
		
		return result;
	}
}

Fábrica de peaje en efectivo:

class CashFactory
{
    
    
	public static CashSuper createCashAccept(string type)
	{
    
    
		CashSuper cs = null;
		swith(type)
		{
    
    
			case "正常收费":
				cs = new CashNormal();
				break;
			case "满300返100":
				CashReturn cr1 = new CashReturn("300","100");
				cs = cr1;
				break;
			case "打8折":
				CashRebate cr2 = new CashReturn("0.8");
				cs = cr1;
				break;
		}
		return cs;
	}
}

Programa principal del cliente (parte principal):

double total = 0.0d;
private void btn0k_Click(object sender,EventArgs e)
{
    
    
	CashSuper csuper = CashFoctory.createCashAccept(cbxType,SelectedItem.ToString());
	double totalPrices = 0d;
	totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice,Text) 
	* Convert.ToDouble(txtNum.Text));
	total = total + totalPrices;
	lbxList.Item.Add("单价:" + textPrice.Text + "数量:" + txtNum.Text + " "
	+ cbxType.SelectedItem + "合计:" + totalPrice,ToStirng());
	lblResult.Text = total.ToString();
}
La programación orientada a objetos no significa que tantas clases como sea posible, la división de clases sea para encapsulación, pero la base de la clasificación es la abstracción.Las clases son colecciones abstractas de objetos con los mismos atributos y funciones.

Pero, ¿existe alguna limitación para esta forma de escribir? Si agrega otro método de promoción, por ejemplo, si necesita 100 puntos y 10 puntos, ¿qué sucede si desea recibir premios en el futuro? Cada vez que mantengo y amplío el método de carga, tengo que cambiar esta fábrica, por lo que el código necesita ser recompilado e implementado ... Así que a continuación continuaré mejorando el modo de escritura basado en estrategias.

Supongo que te gusta

Origin blog.csdn.net/A_Tu_daddy/article/details/103360875
Recomendado
Clasificación