`

行为型模式--策略模式(Strategy)

阅读更多

一:定义:

Strategy:Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

二:引入

假设现在要设计一个贩卖各类书籍的电子商务网站的购物车(Shopping Cat)系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。

比如:

  • 本网站可能对所有的儿童类图书实行每本一元的折扣;
  • 对计算机类图书提供每本7%的促销折扣,而对电子类图书有3%的折扣;
  • 对其余的图书没有折扣。
  • 未来可能还会有新的打折策略。

由于有这样复杂的折扣算法,使得价格计算问题需要系统地解决。

  

            方案一:业务逻辑放在各具体子类

/**//*
*各子类实现销售价格算法
*/

public abstract class Book ...{
    
private double price;
    
private String name;
    
    
public String getName() ...{
        
return name;
    }

    
public void setName(String name) ...{
        
this.name = name;
    }

    
public double getPrice() ...{
        
return price;
    }

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


    
public abstract double getSalePrice() ;
    
}


public class CsBook extends Book...{
      
public CsBook(String name,double price)
      
...{
        
this.setName(name);
        
this.setPrice(price);
      }

      
      
public double getSalePrice()
      
...{
          
return this.getPrice()*0.93;
      }

}


public class ChildrenBook extends Book ...{
    
    
public ChildrenBook(String name, double price) ...{
        
this.setName(name);
        
this.setPrice(price);
    }


    
public double getSalePrice() ...{
        
return this.getPrice() - 1;
    }

}


public class Client ...{

    
public static void main(String args[])
    
...{
        Book csBook1
=new CsBook("Think in java",45);
        Book childrenBook1
=new ChildrenBook("Hello",20);
        
        System.out.println(csBook1.getName()
+":"+csBook1.getSalePrice());
        System.out.println(childrenBook1.getName()
+":"+childrenBook1.getSalePrice());
    }

}

问题:每个子类必须都各自实现打折算法,即使打折算法相同。所以code reuse不好

方案二:

//把打折策略代码提到父类来实现code reuse
public abstract class Book ...{
    
private double price;
    
private String name;
    
    
public String getName() ...{
        
return name;
    }

    
public void setName(String name) ...{
        
this.name = name;
    }

    
public double getPrice() ...{
        
return price;
    }

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


//    销售价格
    public static double toSalePrice(Book book)
    
...{
        
if (book instanceof ChildrenBook)
        
...{
            
return book.getPrice()-1;
        }

        
else if (book instanceof CsBook)
        
...{
            
return book.getPrice()*0.93;
        }

        
return 0;
    }

}



public class Client ...{

    
    
public static void main(String args[])
    
...{
        Book csBook1
=new CsBook("Think in java",45);
        Book childrenBook1
=new ChildrenBook("Hello",20);
        System.out.println(csBook1.getName()
+":"+Book.toSalePrice(csBook1));
        System.out.println(childrenBook1.getName()
+":"+Book.toSalePrice(childrenBook1));
    }

}

 toSalePrice方法是比较容易change的地方,如果策略复杂用if判断比较乱,并且策略修改或增加时需改变原代码。

 

方案三:策略模式

code reuse时最好用合成(HAS-A)而不用(IS-A),更加灵活。 

public abstract class Book ...{
    
private double price;
    
private String name;
    
private DiscountStrategy discountStrategy;//折扣策略
    
    
public String getName() ...{
        
return name;
    }

    
public void setName(String name) ...{
        
this.name = name;
    }

    
public double getPrice() ...{
        
return price;
    }

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

    
    
public DiscountStrategy getDiscountStrategy() ...{
        
return discountStrategy;
    }

分享到:
评论

相关推荐

    c++设计模式-行为型模式-策略模式

    c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...

    (行为型模式) Strategy 策略模式

    C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载

    C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C#中,策略模式经常被用来解决复杂的问题,特别是在需要动态切换算法或行为的场景下。它通过将算法封装到具有独立接口的类中,使得算法可以互相替换...

    设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择合适的...

    设计模式-Strategy模式

    Strategy模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式的核心思想是将算法族封装在独立的对象中,使得它们可以互换使用,让算法的变化独立于使用算法的客户。 在上述的国际电子商务系统案例中...

    Java 设计模式-策略模式(Strategy)Android讲解

    首先,策略模式由三个主要组成部分构成:上下文(Context)、策略(Strategy)接口和具体策略(Concrete Strategy)。上下文是使用策略的对象,它维护一个对策略的引用,并调用策略的接口来执行算法。策略接口定义了一组...

    设计模式-策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。这种模式允许你使用算法族,而无需在代码中硬编码这些算法。通过将算法封装到具有共同接口的独立对象中,策略模式使得你可以根据需要灵活地切换算法,...

    php设计模式-策略模式-例题学习

    策略模式是设计模式的一种,它允许我们在运行时动态地改变对象的行为。在这个"php设计模式-策略模式-例题学习"的例子中,我们将深入理解策略模式的运用及其在PHP中的实现。 首先,让我们来看看核心的类和接口: ...

    行为型——Strategy(策略模式)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并让它们之间可以互相...

    C#面向对象设计模式纵横谈\23 行为型模式Strategy策略模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第23节:行为型模式Strategy策略模式

    设计模式---策略者模式

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要在不同时间或根据不同条件执行不同算法的情况。策略模式允许我们将算法封装到独立的可互换的策略类中,使得算法的变化...

    设计模式--策略模式java例子

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式通常用于替换硬编码的条件语句,使代码更加灵活、可扩展和易于维护。下面我们将详细探讨策略模式的核心概念、实现方式以及在实际...

    设计模式-策略模式-c++版

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在C++中,策略模式主要用于封装一系列算法,并让它们之间可以互相替换,使得算法的变化独立于使用算法的客户。这种模式通常涉及三个主要角色:策略...

    C++设计模式--基于Qt4开源跨平台开发框架

    行为型模式如观察者模式(Observer)、策略模式(Strategy)和访问者模式(Visitor),关注对象之间的交互和责任分配。 在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为...

    策略(strategy)模式

    这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据策略对象改变的上下文对象。策略对象改变上下文对象的执行算法。策略模式可以定义一系列的算法,并将每一个算法封装起来...

    微信小程序--使用策略模式进行表单验证strategy-master.zip

    本项目"微信小程序--使用策略模式进行表单验证strategy-master.zip"聚焦于如何通过策略模式来优化这一过程。策略模式是一种行为设计模式,允许我们在运行时选择算法或策略,使得代码更加灵活且易于扩展。 首先,...

    L14-设计模式-行为型模式v21

    策略模式的优点是:可以实现算法的灵活性和可维护性,且可以减少代码的重复。 在本讲内容中,我们将通过实例介绍迭代器模式、模板方法模式和策略模式的应用。 案例:语言集成查询LINQ 语言集成查询LINQ(Language...

    人人都会设计模式---策略模式--Strategy

    【策略模式】是一种设计模式,它的核心思想是将不同的算法或行为封装成独立的类,这些类具有统一的接口,从而使客户端可以灵活地选择并使用其中的任何一种算法,而无需关心具体实现的细节。这种模式可以有效地避免...

    设计模式--策略模式StrategyPattern

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,并在运行时选择具体...

    走进设计模式之 策略模式(Strategy)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件设计中,有时我们需要根据不同的场景或条件选择不同的算法或行为。策略模式允许我们将这些算法封装成独立的类,每个类代表一种策略,然后在运行...

Global site tag (gtag.js) - Google Analytics