设计模式之Strategy模式

策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具体的共同接口的独立类中,从而使得他们能够互相替换。算法

策略模式使得算法能够在不影响客户端的状况下发生变化。函数

all in one “准备一组算法,并将每个算法封装起来,使得它们能够互换”。this

三个角色:spa

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

策略接口角色:这是一个抽象角色,一般由一个接口或抽象类实现。此角色给出全部的具体策略类所需的接口。对象

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

 

环境角色:接口

package com.yzf.pattern.strategy;

/**
 * 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具备更好的维护性和扩展性。
 * 在每个时刻只能使用一个具体的策略实现对象
 * @author luozuzu
 *
 */
public class Price {
    //持有一个具体的策略对象
    private MemberStrategy memberStrategy;
    
    /**
     * 构造函数,传入一个具体的策略对象
     * @param memberStrategy
     */
    public Price( MemberStrategy memberStrategy){
        this.memberStrategy = memberStrategy;
    }
    
    public double quote(double price){
        return this.memberStrategy.calcPrice(price);
    }
}

接口类:class

package com.yzf.pattern.strategy;

//策略接口
public interface MemberStrategy {
    public double calcPrice(double price);
}

策略实现类扩展

package com.yzf.pattern.strategy;

public class FirstMemberStrategy implements MemberStrategy {
    
    //具体策略算法1
    public double calcPrice(double price) {
         
        System.out.println("对于初级会员的没有折扣");
        
        return price;
    }

}
package com.yzf.pattern.strategy;

public class SecondMemberStrategy implements MemberStrategy {
    //具体策略算法2
    public double calcPrice(double price) {
        System.out.println("对于中级会员的折扣为10%");
        return price * 0.9;
    }

}
package com.yzf.pattern.strategy;

public class ThirdMemberStrategy  implements MemberStrategy {
    
    //具体策略算法3
    public double calcPrice(double price) {
         System.out.println("对于高级会员的折扣为20%");
         return price * 0.8;
    }
}

客户端

package com.yzf.pattern.strategy;

public class Client {

    public static void main(String[] args) {
        //MemberStrategy ms = new FirstMemberStrategy();
        
        //MemberStrategy ms = new FirstMemberStrategy();
        
        MemberStrategy ms = new SecondMemberStrategy();
        Price p = new Price(ms);
        double quote = p.quote(300);
        System.out.println(quote);
    }

}

  策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具备更好的维护性和扩展性。

相关文章
相关标签/搜索