设计模式(十七)——策略模式

一、商场收银软件
用简单工厂实现:

abstract class CashSuper { // 现金收费抽象类
	public abstract double acceptCash(double money);
}

class CashNormal extends CashSuper { // 正常收费子类

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money;
	}

}

class CashRebate extends CashSuper { // 打折收费子类
	private double moneyRebate = 1d;

	public CashRebate(double moneyRebate) { // 打折收费,初始化时要输入折扣率
		this.moneyRebate = moneyRebate;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money * moneyRebate;
	}

}

class CashReturn extends CashSuper { // 返利收费子类
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;

	public CashReturn(double moneyCondition, double moneyReturn) {
		super();
		this.moneyCondition = moneyCondition;
		this.moneyReturn = moneyReturn;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		double result = money;
		if (money >= moneyCondition) {
			result = money - Math.floor(money / moneyCondition) * moneyReturn;
		}
		return result;
	}

}

class CashFactory { // 现金收费工厂类
	public static CashSuper createCashAccept(String type) {
		CashSuper cs = null;
		switch (type) {
		case "正常收费":
			cs = new CashNormal();
			break;
		case "满300返100":
			CashReturn cr1 = new CashReturn(300, 100);
			cs = cr1;
			break;
		case "打8折":
			CashRebate cr2 = new CashRebate(0.8);
			cs = cr2;
			break;
		}
		return cs;

	}
}

二、策略模式
策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

//策略模式
abstract class Strategy { // Strategy类,定义所有支持的算法的公共接口
	public abstract void AlgorithmInterface();
}

class ConcreteStrategyA extends Strategy { // 具体算法A

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法A实现");
	}

}

class ConcreteStrategyB extends Strategy { // 具体算法B

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法B实现");
	}

}

class ConcreteStrategyC extends Strategy { // 具体算法C

	@Override
	public void AlgorithmInterface() {
		// TODO Auto-generated method stub
		System.out.println("算法C实现");
	}

}

class Context { // Context,用一个ContextStrategy来配置,维护一个对Strategy对象的引用
	Strategy strategy;

	public Context(Strategy strategy) {
		this.strategy = strategy;
	}

	public void ContextInterface() {
		strategy.AlgorithmInterface();
	}
}

public class Main {
	public static void main(String[] args) {
		Context context;
		context = new Context(new ConcreteStrategyA());
		context.ContextInterface();
		context = new Context(new ConcreteStrategyB());
		context.ContextInterface();
		context = new Context(new ConcreteStrategyC());
		context.ContextInterface();
	}
}

用策略模式实现银行收银:

//用策略模式实现银行收银
abstract class CashSuper { // 现金收费抽象类
	public abstract double acceptCash(double money);
}

class CashNormal extends CashSuper { // 正常收费子类

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money;
	}

}

class CashRebate extends CashSuper { // 打折收费子类
	private double moneyRebate = 1d;

	public CashRebate(double moneyRebate) { // 打折收费,初始化时要输入折扣率
		this.moneyRebate = moneyRebate;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money * moneyRebate;
	}

}

class CashReturn extends CashSuper { // 返利收费子类
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;

	public CashReturn(double moneyCondition, double moneyReturn) {
		super();
		this.moneyCondition = moneyCondition;
		this.moneyReturn = moneyReturn;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		double result = money;
		if (money >= moneyCondition) {
			result = money - Math.floor(money / moneyCondition) * moneyReturn;
		}
		return result;
	}

}

class CashContext {
	private CashSuper cs;

	public CashContext(CashSuper csuper) {
		this.cs = csuper;
	}

	public double GetResult(double money) {
		return cs.acceptCash(money);
	}
}

策略模式与简单工厂结合:

//策略与简单工厂结合
abstract class CashSuper { // 现金收费抽象类
	public abstract double acceptCash(double money);
}

class CashNormal extends CashSuper { // 正常收费子类

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money;
	}

}

class CashRebate extends CashSuper { // 打折收费子类
	private double moneyRebate = 1d;

	public CashRebate(double moneyRebate) { // 打折收费,初始化时要输入折扣率
		this.moneyRebate = moneyRebate;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		return money * moneyRebate;
	}

}

class CashReturn extends CashSuper { // 返利收费子类
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;

	public CashReturn(double moneyCondition, double moneyReturn) {
		super();
		this.moneyCondition = moneyCondition;
		this.moneyReturn = moneyReturn;
	}

	@Override
	public double acceptCash(double money) {
		// TODO Auto-generated method stub
		double result = money;
		if (money >= moneyCondition) {
			result = money - Math.floor(money / moneyCondition) * moneyReturn;
		}
		return result;
	}

}

class CashContext {
	private CashSuper cs = null;

	public CashContext(String type) {
		switch (type) {
		case "正常收费":
			cs = new CashNormal();
			break;
		case "满300返100":
			CashReturn cr1 = new CashReturn(300, 100);
			cs = cr1;
			break;
		case "打8折":
			CashRebate cr2 = new CashRebate(0.8);
			cs = cr2;
			break;
		}
	}

	public double GetResult(double money) {
		return cs.acceptCash(money);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值