设计模式之Strategy模式

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

策略模式使得算法可以在不影响客户端的情况下发生变化。

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

三个角色:

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

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

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

环境角色:

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);
    }
}

接口类:

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);
    }

}

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

原文地址:https://www.cnblogs.com/yaoyiyao/p/7212389.html