`

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

阅读更多

策略模式

1.定义

       定义一系列的算法,把它们一个个封装起来,并且使特们可相互替换。本模式使得算法可独立与使用它的客户而变化。

2.示例代码

        展示了多种工资支付方式的策略。

 

/*支付工资的策略接口,公司有多种支付工资的算法*/
public interface PaymentStrategy{
    //支付工资的算法,传入算法所需的数据,上下文 
    public void pay(PaymentContext ctx);
}

/*人民币现金支付策略*/
public class RMBCash implements PaymentStrategy{
     public void pay(PaymentContext ctx){
         System.out.println("现在给" + ctx.getUserName() + "人民币现金支付" + ctx.getMoney() + "元");
     }
}

/*美元现金支付策略*/
public class DollarCash implements PaymentStrategy{
     public void pay(PaymentContext ctx){
         System.out.println("现在给" + ctx.getUserName() + "美元现金支付" + ctx.getMoney() + "元");
     }
}

   

/*支付工资的上下文,每个人的工资不同,支付方式也不同*/
public class PaymentContext{
    private String userName = null;
    private double money = 0.0;
    //支付工资的策略接口
    public PaymentStrategy strategy = null;
    //构造方法传入被支付工资的人员,应支付的金额和具体的支付策略
    public PaymentContext(String userName,double money,PaymentStrategy strategy){
         this.userName = userName;
         this.money = money;
         this.strategy = strategy;
    }
    public String getUserName(){
          return userName;
    }
    public double getMoney(){
          return money;
    }
    //支付工资
    public void payNow(){
        //使用客户希望的支付策略来支付
        this.strategy.pay(this);
    }
}

  

/*客户端支付工资*/
public class Client{
    //创建相应的支付策略
    PaymentStrategy strategyRMB = new RMBCash();
    PaymentStrategy strategyDollar = new DollarCash();
    //给小李支付工资
    PayContext ctx1 = new PayContext("小李",5000,strategyRMB);
    ctx1.payNow();
    //给petter支付工资
    PayContext ctx2 = new PayContext("petter",3000,strategyDollar);
    ctx2.payNow();
}

 

3.实际应用

     策略模式的一系列策略算法是平等的,是可以通过if-else结构来组织的,这些算法的地位是平等的,可以相互替换的。如果策略过多会导致相应的对象过多。

 

策略模式的本质:分离算法,选择实现
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics