Fork me on GitHub

策略模式(Strategy)简介

一、策略模式(Strategy)简介

策略模式是行为模式.

行为模式:规定了各个对象应该具备的职责以及对象间的通信模式,它很好的规范了对象间调用和数据传递方式

策略模式适合于算法经常变化的情况

算法的变化不会影响到使用算法的客户,算法可以独立于使用它的客户所变化

二、简单例子

普通客户,会员,VIP会员购买商品价格不一样

 抽象类

package strategy;
/*
 * 计算商品价格的抽象类
 */
public abstract class Account {

abstract public double getPrice(int amount,double d);
    
}

普通

package strategy;
/**
 * 普通客户商品价格计算
 */
public class CommonAccount extends Account {

    @Override
    public double getPrice(int amount, double price) {

        return amount*price;
    }

}

 

会员

package strategy;
/**
 * 普通会员商品价格计算打9折
 */
public class InsiderAccount extends Account {

    @Override
    public double getPrice(int amount, double price) {
        return amount*price*9/10;
    }

}

 

VIP

package strategy;
/**
 * VIP会员商品价格计算打8折
 */
public class VipAccount extends Account {

    @Override
    public double getPrice(int amount, double price) {
    
        return amount*price*8/10;
    }

}

上下文类

package strategy;
/**
 * 此类用于维护策略类的引用
 */
public class Context {
    //引用
    private Account account;
    //初始化
    public Context(Account account){
        this.account=account;
    }
    //调用计算方法
    public double doAccount(int amount, double d){
        return account.getPrice(amount, d);
    }
    
}

测试类

package strategy;
/**
 * 此策略模式测试类
 */
public class Test {

    public static void main(String[] args) {
        // 声明商品
        String name = "DVD";
        int amount = 2;
        double price = 50;
        double sum = 0;
        // 声明对象
        // 普通客户
        Context context = new Context(new CommonAccount());
        sum = context.doAccount(amount, price);
        System.out.println("普通客户:没有折扣,购买的商品名称:    " + name + "       数量:   "
                + amount + "      单价:" + price + "      应付金额:" + sum);
        // 普通会员
        context = new Context(new InsiderAccount());
        sum = context.doAccount(amount, price);
        System.out.println("普通会员:9折优惠,购买的商品名称:    " + name + "       数量:   "
                + amount + "      单价:" + price + "      应付金额:" + sum);
        // VIP
        context = new Context(new VipAccount());
        sum = context.doAccount(amount, price);
System.out.println(
"VIP客户:8折优惠,购买的商品名称: " + name + " 数量: " + amount + " 单价:" + price + " 应付金额:" + sum); } }

结果:

普通客户:没有折扣,购买的商品名称:    DVD       数量:   2      单价:50.0      应付金额:100.0
普通会员:9折优惠,购买的商品名称:    DVD       数量:   2      单价:50.0      应付金额:90.0
VIP客户:8折优惠,购买的商品名称:    DVD       数量:   2      单价:50.0      应付金额:80.0

 

posted @ 2015-03-21 01:19  森林森  阅读(769)  评论(0编辑  收藏  举报