策略模式

来源:互联网 发布:数据分析入门书籍 编辑:程序博客网 时间:2024/05/07 23:32

设计一个当当购物网站

算法一:对初级会员没有折扣

算法二:对中级会员提供10%的促销折扣

算法三:对高级会员提供20%的促销折扣

 

抽象折扣类

public interface MemberStrategy {

    /**

     * 计算图书的价格

     * @param booksPrice    图书的原价

     * @return    计算出打折后的价格

     */

    public double calcPrice(double booksPrice);

}

初级会员折扣类

public class PrimaryMemberStrategy implements MemberStrategy{

@Override

public double calcPrice(double booksPrice){

System.out.println(“对于初级会员没有折扣”);

return bookPrice;

}

}

 

中级会员折扣类

public class PrimaryMemberStrategy implements MemberStrategy{

@Override

public double calcPrice(double booksPrice){

System.out.println(“对于初级会员折扣为%10”);

return bookPrice*0.9;

}

}

 

高级会员折扣类

public class PrimaryMemberStrategy implements MemberStrategy{

@Override

public double calcPrice(double booksPrice){

System.out.println(“对于高级会员折扣为20%”);

return bookPrice*0.8;

}

}

价格类

public class Price{

private MemberStrategy strategy;

/**

     * 构造函数,传入一个具体的策略对象

     * @param strategy    具体的策略对象

     */

public Price(MemberStrategy strategy){

this.strategy=strategy;

}

/**

     * 计算图书的价格

     * @param booksPrice    图书的原价

     * @return    计算出打折后的价格

     */

Public double quote(double bookSPrice){

return this.strategy.calcPrice(booksPrice);

}

}

 

客户端

public class Client{

Public static void main(String[] args){

//选择并创建使用的策略对象

MemberStrategy strategy=new AdvancedMemberStrategy();

//创建环境

Price price=new Price(strategy);

//计算价格

Double quote=price.quote(300);

System.out.println(“图书的最终价格为:”+quote);

}

}

针对一组算法,将每一个算法封装到具有共同接口的独立类中,使得它们恶意相互替换。

涉及三个角色

1.环境角色,持有一个strategy的引用

2.抽象策略角色,同常是一个接口或抽象类,封装了具体需要的接口或抽象方法

3.实现角色,具体实现相同接口(抽象类)的不同的算法

 

实现类通过继承环境角色,通过构造传入不同的参数调用不同的方法,父类相同,体现了类的多态性

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

​组成

-抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

-具体策略角色:包装了相关的算法和行为。

-环境角色:持有一个策略类的引用,最终给客户端调用。


原创粉丝点击