`
阅读更多

[关键字]: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
分享到:
评论

相关推荐

    物件導向策略模式

    ### 物件導向策略模式解析 #### 一、引言 物件導向程式設計(Object-Oriented Programming, OOP)是一種重要...遵循物件導向設計的三個原則,我們可以更好地利用策略模式來解決實際問題,提高程式的可維護性和擴展性。

    设计模式——原版的设计模式

    策略模式定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,策略对象改变算法的执行策略;职责链模式避免将请求的发送者和接收者耦合在一起,而是将这些对象连成一条链,并沿着这条链传递请求,直到有...

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

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

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

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

    常用设计模式例题(原创)

    在给定的压缩包文件中,我们可以看到涉及到九种基本的设计模式,它们分别是:组合模式(Composite)、策略模式(Strategy)、外观模式(Facade)、观察者模式(Observer)以及单例模式(Singleton)。接下来,我们将...

    软件设计精要与模式原代码

    4. **行为型模式**:如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、责任链模式(Chain of Responsibility)、命令模式(Command)、迭代器模式(Iterator)、访问者模式...

    基于云原生计算的5G网络演进策略.pdf

    5G网络的演进策略正越来越多地依赖于云原生技术,以适应高速率、低延迟、高可靠性的行业特定应用场景。 【5G网络服务化架构】 5G网络基于服务化架构,这一架构使得网络功能模块化,能够灵活组合并按需提供服务。...

    纯原创电商服装品牌营销发展模式探析.pdf

    本文旨在深入探讨纯原创电商服装品牌的营销发展模式,分析其在新时代背景下的机遇与挑战,并提出相应的策略。 首先,电商平台的发展趋势对服装品牌营销具有重要影响。在5G时代,电商行业的变化日新月异,视频时代、...

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

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

    java设计模式_原创

    其中包括责任链模式、命令模式、迭代器模式、访问者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。责任链模式通过建立处理请求的对象链,使得请求可以在链上传递,直到被某个对象...

    利用策略模式与装饰模式扩展JavaScript表单验证功能

    在JavaScript中,设计模式是一种通用的、可...策略模式提供了添加、切换验证规则的能力,装饰模式确保了验证在提交之前正确执行,而无需改变原函数的结构。这种设计使得代码更易于维护,也更容易适应未来的需求变化。

    原版PPT和源码

    10. 策略模式:定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换,策略模式让算法的变化独立于使用算法的客户。 通过结合PPT的学习和源码的实践,你将能够更好地理解这些设计模式,从而提升你的编程...

    JavaScript 设计模式(高清扫描版本)- 张容铭

    3. 行为型模式:这些模式关注对象之间的交互和职责分配,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。在JavaScript中...

    23种java设计模式.pdf

    * Strategy(策略模式):使用不同的策略来实现不同的算法。 * State(状态模式):使用状态机来实现对象的状态转换。 * Observer(观察者模式):使得对象能够观察其他对象的变化。 * Visitor(访问模式):提供了...

    JavaScript设计模式之策略模式详解

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在JavaScript中,策略模式的应用可以帮助我们更好地组织代码,提高代码的可扩展性和可维护性。以下是对策略模式的详细解析: 首先,策略模式的核心...

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

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

    修改和定制Android音频策略

    ### 修改和定制Android音频策略 #### 一、引言 随着智能设备的普及和技术的发展,车载导航仪等移动终端的功能日益强大,对于音频输出的需求也更加多样化。Android系统作为目前主流的操作系统之一,在多媒体处理...

    研磨设计模式.rar

    行为型模式关注对象间的行为分配,如策略模式、观察者模式、访问者模式、责任链模式、命令模式、解释器模式、迭代器模式、备忘录模式、状态模式、模板方法模式和访问者模式,它们处理对象间的通信和行为。...

    总体审计策略记录模式范例.doc

    在《总体审计策略记录模式范例》中,方圆公司的审计范围覆盖了A类原材料和B种产成品的盘点工作。原材料和产成品的管理直接关联着企业的供应链和生产流程,是评价企业财务健康状况的重要指标。此外,考虑到能源是现代...

    供应链管理采购模式策略分析.pdf

    供应链管理采购模式策略分析还可以降低企业的原材料、零部件的库存水平,降低管理费用,加快资金周转。在质量方面,由于供应商的数量少而且企业可以参与到供应商的生产组织过程和有关质量控制过程中去,能够对采购的...

Global site tag (gtag.js) - Google Analytics