`
阅读更多

[关键字]:java,design pattern,设计模式,《Java与模式》学习,Strategy,策略模式,图书,折扣,DiscountStrategy
[环境]:StarUML5.0 + JDK6
[作者]:Winty (wintys@gmail.com)
[正文]:



package pattern.strategy;

/**
 * 策略模式:Strategy Pattern
 *
 * 图书折扣的计算:
 * 1、无折扣
 * 2、固定折扣(例如:提供10元的折扣)
 * 3、百分比折扣(例如:提供7%的折扣)
 *
 * @verison 2009-05-20
 * @author Winty (wintys@gmail.com)
 *
 */
public class StrategyTest {
    public static void main(String[] args) {
        double discount = 0;
        Book book = new Book(88.5);
       
        book.setStrategy(new NoDiscountStrategy());
        discount = book.getDiscount();
        System.out.println("折扣:" + discount);
       
        book.setStrategy(new FlatDiscountStrategy(10));
        discount = book.getDiscount();
        System.out.println("折扣:" + discount);
       
        book.setStrategy(new PercentageDiscountStrategy(0.07));
        discount = book.getDiscount();
        System.out.println("折扣:" + discount);
    }
}

/**
 * 环境(Context)
 * @author Winty
 *
 */
class Book{
    private double price;
    private DiscountStrategy strategy;
   
    public Book(double price){
        this.price = price;
    }

    /**
     * 调用Strategy的策略方法进行计算
     * @return 折扣数额
     */
    public double getDiscount(){
        strategy.setPrice(price);

        return strategy.calculateDiscount();
    }
   
    public DiscountStrategy getStrategy() {
        return strategy;
    }

    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }
   
    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

/**
 * 抽象策略:Strategy
 * @author Winty
 *
 */
abstract class DiscountStrategy{
    private double price;
   
    public DiscountStrategy(){
    }
   
    /**
     * 策略方法
     * @return 折扣数额
     */
    public abstract double calculateDiscount();

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

/**
 * 具体策略:无折扣算法
 * @author Winty
 *
 */
class NoDiscountStrategy extends DiscountStrategy{
    public NoDiscountStrategy(){
    }
   
    @Override
    public double calculateDiscount(){
        return 0.0;
    }
}

/**
 * 具体策略:固定量折扣算法
 * @author Winty
 *
 */
class FlatDiscountStrategy extends DiscountStrategy{
    private double amount;
   
    public FlatDiscountStrategy(double amount){
        this.amount = amount;
    }
   
    @Override
    public double calculateDiscount() {
        return amount;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }
}

/**
 * 具体策略:百分比折扣策略
 * @author Winty
 *
 */
class PercentageDiscountStrategy extends DiscountStrategy{
    private double percent;
   
    public PercentageDiscountStrategy(double percent){
        this.percent = percent;
    }

    @Override
    public double calculateDiscount() {
        return getPrice()*percent;
    }

    public double getPercent() {
        return percent;
    }

    public void setPercent(double percent) {
        this.percent = percent;
    }
}

 

原创作品,转载请注明出处。
作者:Winty (wintys@gmail.com)
博客:http://www.blogjava.net/wintys
  • 大小: 71.5 KB
分享到:
评论

相关推荐

    设计模式之PHP项目应用(策略模式:商场收银系统)

    1)程序功能:用策略模式实现商场收银系统,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/45722661。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目应用》...

    【资源免费下载】Java代码积累丨大话设计模式(Java实现版本)、线程协作

    策略模式 观察者模式 状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - ...

    设计模式之PHP项目应用(策略模式:自动驾驶系统)

    1)程序功能:用策略模式实现自动驾驶系统,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/45723773。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目应用》...

    忻定原城镇组群空间组织模式及发展策略研究

    忻定原城镇组群空间组织模式及发展策略研究,彭翀,常黎丽,本文以我国中部地区为例,随着城镇化全面推进和城市群蓬勃发展,城市群内部空间组织模式对于城市群空间目标的实现、城市间的发展

    UML和模式应用(原书第3版).pdf

    3.2 案例研究策略:迭代开发+迭代学习 3.3 案例一:NextGen POS系统 3.4 案例二:Monopoly游戏系统 第二部分 初 始 阶 段 第4章 初始不是需求阶段 4.1 什么是初始 4.2 初始阶段的持续时间 4.3 初始阶段会...

    设计模式可复用面向对象软件的基础.zip

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 Abstract Factory模式 35...

    Ruby设计模式(中文版+英文版).pdf

    Ruby设计模式的中文pdf高清扫描版本和英文原版本pdf文件。 本书是一本关于设计模式方面的重点书籍。本书以通俗易懂的方式介绍了Ruby设计模式,主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察...

    设计模式:可复用面向对象软件的基础--详细书签版

    2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 monoglyph 30 2.4.3 decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 abstract ...

    C#23种设计模式_示例源代码及PDF

    原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...

    j2ee核心模式

    《J2EE核心模式》(原书第2版):“Java领域的版图上撒满了各种类库、工具和技术规范。而缺乏的则是把这些内容融合在一起、解决真实情况下的问题的专业能力。本书中的这些模式,成为了J2EE软件建设过程中的智能水泥。 ...

    J2EE核心模式

    《J2EE核心模式》(原书第2版):“Java领域的版图上撒满了各种类库、工具和技术规范。而缺乏的则是把这些内容融合在一起、解决真实情况下的问题的专业能力。本书中的这些模式,成为了J2EE软件建设过程中的智能水泥。,...

    java设计模式选择题复习题.doc

    一般情况下,策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族, 分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客 户。可以应用的场景有优惠系统、工资计算系统等...

    论文研究-AVS中帧内预测模式的快速选择策略.pdf

    为了降低AVS帧内预测模式的计算复杂度,提出了一种率失真优化(RDO)准则下的基于边缘...仿真结果表明,与原AVS相比,该算法在比特率略有增加和信噪比基本保持不变的条件下,大大减少了计算时间,提高了AVS编码速度。

    C#游戏贪食蛇源代码 (结合2设计模式)(Sairns,董侨)

    4.0 引入简单工厂,结合策略模式对游戏优化并加入动态加速功能,将原GUI+绘蛇变更为,自制Control控件, 关卡不变(解决了双缓冲无法解决屏幕闪烁问题) 5.0 美化游戏,应用分层理念封装各实体类 制作人: 董...

    【重磅】史上最全的阿里云分享的云原生技术学习资料合集(120份).zip

    快速交付云原生应用的 3 种发布策略详解 流量太大容易挂?接入 Sentinel 让 N 个 9 成为可能! 容器化应用痛点剖析:问题诊断、监控及运维 如何借助 Serverless 技术降低闲置计算资源成本 十分钟上线-使用函数计算...

    j2EE核心模式

    《J2EE核心模式》(原书第2版):“Java领域的版图上撒满了各种类库、工具和技术规范。而缺乏的则是把这些内容融合在一起、解决真实情况下的问题的专业能力。本书中的这些模式,成为了J2EE软件建设过程中的智能水泥。,...

    Scratch 策略游戏:阳光养“码”场

    两个一样的小码君可以合成一个新的小码君,一共十阶,你能...此后仍有作品或有趣游戏、爆笑作品,请关注原作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论吧!

    UML和模式应用(架构师必备).part02.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

Global site tag (gtag.js) - Google Analytics