zoukankan      html  css  js  c++  java
  • 策略模式(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
  • 相关阅读:
    2011全国大学生电子竞赛我们组的方案——A题开关电源模块并联供电系统(草稿)
    perl 引用实例
    R 批量读取本地文件
    R语言对数据集进行排序
    perl 常用函数和符号
    Linux下设置环境变量
    读取前200行
    R字符串处理
    R graph:如何自定义坐标轴刻度标示(tick label)
    perl中如何调用R语言
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4352537.html
Copyright © 2011-2022 走看看