Java策略模式

参考:https://blog.csdn.net/zhangliangzi/article/details/52161211

参考:https://blog.csdn.net/zhengzhb/article/details/7609670

1.在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。

这个模式设计三个角色:

环境角色:持有一个Strategy的引用

抽象策略角色:这个一个抽线角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

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

/*
 *引例:设计一个贩卖各种书籍的电子商务网址的购物车系统。对于中级会员提供每本10%的促销折扣
 *对高级会员提供每本20%的促销折扣,对初级会员没有折扣
 */
//抽象折扣类
interface MemberStrategy {
    /**
     * 计算图书的价格
     * @param booksPrice    图书的原价
     * @return    计算出打折后的价格
     */
    public double calcPrice(double booksPrice);
}
//初级折扣类
class PrimaryMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于初级会员的没有折扣");
        return booksPrice;
    }

}
//中级折扣类
class IntermediateMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {

        System.out.println("对于中级会员的折扣为10%");
        return booksPrice * 0.9;
    }

}
//高级折扣类
class AdvancedMemberStrategy implements MemberStrategy {

    @Override
    public double calcPrice(double booksPrice) {
        
        System.out.println("对于高级会员的折扣为20%");
        return booksPrice * 0.8;
    }
}
//价格类
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 StartegyTest {
	public static void main(String[] args) {
		 //选择并创建需要使用的策略对象
	    MemberStrategy strategy = new AdvancedMemberStrategy();
	    //创建环境
	    Price price = new Price(strategy);
	    //计算价格
	    double quote = price.quote(300);
	    
	    //中级会员
	    MemberStrategy strategy1 = new IntermediateMemberStrategy();
	    Price price1 = new Price(strategy1);
	    double quote1 = price1.quote(300);
	    
	    System.out.println("高级会员图书的最终价格为:" + quote);
	    System.out.println("中级会员图书的最终价格为:" + quote1);
	}
}

 

你可能感兴趣的:(设计模式)