>  기사  >  Java  >  Java 구현 전략(Strategy) 패턴에 대한 자세한 소개

Java 구현 전략(Strategy) 패턴에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-11 10:59:371734검색

전략 패턴: 행동 패턴

동일한 행동에 대해 서로 다른 처리 알고리즘을 캡슐화합니다. 상호 교환 가능하게 만드세요

1. 상위 유형 인터페이스와 동작 메서드를 정의하세요

2. 이 동작을 달성하기 위해 다양한 구현 클래스를 정의하세요


/**
 * 策略模式:针对同一命令(或行为),不同的策略做不同的动作
 *  商品促销
 *  本类为:收取现金的类
 *  
 *  @author stone
 */
public interface ICashSuper {
	 double acceptCash(double money);
}
/**
 * 正常收取现金
 * @author stone
 *
 */
public class CashNormal implements ICashSuper {

	@Override
	public double acceptCash(double money) {
		return money;
	}

}
/**
 * 打折收取现金 
 * @author stone
 *
 */
public class CashRebate implements ICashSuper {
	private double rebate; //折扣
	public CashRebate (double rebate) {
		this.rebate = rebate;
	}

	@Override
	public double acceptCash(double money) {
		return new BigDecimal(money * rebate / 10).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	
}
/**
 * 让利返现  收取现金
 * @author stone
 *
 */
public class CashReturn implements ICashSuper {
	private double moneyCondition; //返现底限金额
	private double returnMoney; //返还金额
	public CashReturn(double moneyCondition, double returnMoney) {
		this.moneyCondition = moneyCondition;
		this.returnMoney = returnMoney;
	}

	@Override
	public double acceptCash(double money) {//多重返利
		if (money >= moneyCondition) {
			return money - Math.floor(money / moneyCondition) * returnMoney;
		} else {
			return money;
		}
	}
	
	
}
/**
 * 根据传递的的策略类,执行相应的行为
 * @author stone
 *
 */
public class CashContext {
	private ICashSuper casher;
	
	public CashContext() {
		
	}
	
	public CashContext(ICashSuper casher) {
		this.casher = casher;
	}
	
	public void setCasher(ICashSuper casher) {
		this.casher = casher;
	}
	
	//根据具体的策略对象,调用它的算法行为
	public double acceptCash(double money) {
		return this.casher.acceptCash(money);
	}
	
}
/*
 * 策略(Strategy)模式 关注:行为的选择
 * 封装了一系列策略对象,用户来选择使用哪种策略对象
 * 与简单工厂的区别:
 * 		策略模式,传入策略对象给Context,由Context封装策略对象的方法调用,对外公开Context的方法接口
 * 		简单工厂模式,传入一个简单参数,创建对象,然后调用出厂对象的方法
 * 与装饰模式的区别:
 * 		很明显,Context无需实现(implements)业务接口,不需要增强已有的策略对象的功能
 * 策略模式多用在算法决策系统中, 比如工资结算
 */
public class Test {
	public static void main(String[] args) {
		double money = 998; //原价
		CashContext cashContext = new CashContext(new CashNormal());
		System.out.println("原价:" + cashContext.acceptCash(money)); //通常  策略
		
		cashContext.setCasher(new CashRebate(8.5));
		System.out.println("打85折:" + cashContext.acceptCash(money)); //折扣   策略   85折
		
		cashContext.setCasher(new CashReturn(300, 50));
		System.out.println("满300 返50:" + cashContext.acceptCash(money)); //返现  策略    满300 返50
		
	}
}

인쇄

原价:998.0
打85折:848.3
满300 返50:848.0

위 내용은 Java 구현 전략(Strategy) 패턴에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.