您的位置:首页 > 其它

策略模式

2017-02-09 05:42 417 查看

  策略模式

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

  策略接口

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
4000

*
*/
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;


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: