策略模式

  策略模式

  本文结合大话设计模式中策略模式总结,以会员结账使用不同的结算规则来描述策略模式。


  策略接口

package com.neutron.strategy;
/**
 * 折扣策略,策略模式中基础算法
 * S:策略接口,定义所有支持的算法公共接口
 * 
 * @author neutron
 *
 */
public interface Discount {
	/**
	 * 打折策略
	 * 
	 * @param original 原始价格
	 * @return 折扣后价格
	 */
	double discount(double original);
}

  算法实现类

package com.neutron.strategy;
/**
 * 策略模式中具体算法,全价策略
 * S:具体策略类,封装具体的算法或行为
 * 
 * @author neutron
 *
 */
public class Percent100 implements Discount {
	private static final double percent100 = 1;
	
	@Override
	public double discount(double original) {
		return percent100 * original;
	}

}
 
package com.neutron.strategy;
/**
 * 策略模式中具体算法,9折策略
 * S:具体策略类,封装具体的算法或行为
 * 
 * @author neutron
 *
 */
public class Percent90 implements Discount {
	private static final double percent90 = 0.9;
	
	@Override
	public double discount(double original) {
		return percent90 * original;
	}

}

package com.neutron.strategy;
/**
 * 策略模式中具体算法,8折策略
 * S:具体策略类,封装具体的算法或行为
 * 
 * @author neutron
 *
 */
public class Percent80 implements Discount {

	private static final double percent80 = 0.8;
	
	@Override
	public double discount(double original) {
		return percent80 * original;
	}

}

package com.neutron.strategy;
/**
 * 策略模式中具体算法,7折策略
 * S:具体策略类,封装具体的算法或行为
 * 
 * @author neutron
 *
 */
public class Percent70 implements Discount {

	private static final double percent70 = 0.7;
	
	@Override
	public double discount(double original) {
		return percent70 * original;
	}

}

package com.neutron.strategy;
/**
 * 策略模式中具体算法,全价策略
 * S:具体策略类,封装具体的算法或行为
 * 
 * @author neutron
 *
 */
public class Percent100 implements Discount {
	private static final double percent100 = 1;
	
	@Override
	public double discount(double original) {
		return percent100 * original;
	}

}
 

  会员等级

package com.neutron.entity;
/**
 * 会员等级
 * 
 * @author neutron
 *
 */
public enum Level {
	gold, silver, bronze, plain;
}
 

  策略上下文

package com.neutron.strategy;

import com.neutron.entity.Level;
/**
 * S:Content上下文,维护策略对象引用
 * 
 * @author neutron
 *
 */
public class DiscountContent {
	private Discount count;

	public DiscountContent(Level level) {
		switch(level) {
			case gold: this.count = new Percent70(); break;
			case silver: this.count = new Percent80(); break;
			case bronze: this.count = new Percent90(); break;
			case plain: this.count = new Percent100(); break;
			default:this.count = new Percent100();
		}
	}
	
	public double contentDiscount(double original) {
		return this.count.discount(original);
	}
	
	
}

  客户端

package com.neutron.client;

import com.neutron.entity.Level;
import com.neutron.strategy.DiscountContent;

/**
 * 策略模式客户端
 * 
 * @author neutron
 *
 */
public class Client {
	/*
	 * 优点:
	 * 1.最大程度上将客户端和业务处理分离出来
	 * 2.客户端只传递会员等级和原始金额
	 */
	public static void main(String[] args) {
		double goldPrice = new DiscountContent(Level.gold).contentDiscount(100);
		System.err.println("gold member: " + goldPrice);
		
		double silverPrice = new DiscountContent(Level.silver).contentDiscount(100);
		System.err.println("silver member: " + silverPrice);
		
		double price = new DiscountContent(Level.plain).contentDiscount(100);
		System.err.println("plain member: " + price);
	}

}

   总结

/**
 * 策略模式案例
 * 
 * 策略模式生活中案例:商场打折,出差去某地可以乘车、轮船、步行、飞机
 * 案例解读:统一行为采用不同的实现方式,打折是计算最终价格的不同方式,去某地出差使用不同的交通工具而已
 * 策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用该算法的客户端
 * 解读定义:定义去某地的各种出发方式,步行、汽车、轮船、飞机等,可以使用任意一种方式并最终到达某地,
 * 		    客户端调用的最终结果是到某地,具体如何实现客户端不关心。
 * 其他解说:
 * 	1.策略模式都是完成相同的工作,只是实现不同,可以以相同的方式调用所有算法,减少算法类和使用算法的耦合。
 * 	2.策略模式封装算法,只要在业务中需要不同时间或者应用不同的业务规则,都可以使用策略模式处理变化的可能性
 * 	3.策略模式中,选择具体实现的职责由客户端承担,并且转移给策略模式的上下文对象
 * @author neutron
 */
package com.neutron.strategy;

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值