Java的策略模式

  策略模式也是我们经常使用的模式,它的定义如下:将可变的部分从程序中抽象分离出来成为算法接口,在该部分下分别封装一系列算法实现并使它们可以相互替换。

  举个例子,我们现在有三种支付方式:支付宝支付,微信支付,银行App支付。假设我们要做一个软件,每个软件都有各自对应的支付方式,在这种情况下,我们就可以把支付方式这个策略分离出来,就可以很方便的在写软件类时使用使用想使用的策略方式。

  把策略做成一个接口,然后把软件做成抽象类,就可以通过继承来很方便的对各个具体软件类和具体策略类进行编写。实现代码如下:

PayStrategy.java
//支付策略接口
public interface PayStrategy {
    void pay();
}

WeiXin.java
public class WeiXin implements PayStrategy {
//微信支付类
    @Override
    public void pay() {
        // TODO Auto-generated method stub
        System.out.println("---请使用微信支付---");
    }

}

Zhifubao.java
public class Zhifubao implements PayStrategy {
//支付宝支付类
    @Override
    public void pay() {
        // TODO Auto-generated method stub
        System.out.println("---请使用支付宝支付---");

    }

}

BanApp.java
public class BankApp implements PayStrategy { //银行App支付类 @Override public void pay() { // TODO Auto-generated method stub System.out.println("---请使用银行app支付---"); } }

  再使用一个软件抽象类,和需要的具体软件类。

PaySoftware.java
//软件抽象类
public abstract class Paysoftware {
//使用组合的方式来实现策略模式
    private PayStrategy strategy;

    public void setStrategy(PayStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void payInterface() {
    strategy.pay();    
    }
    
    //没有使用策略模式的方法
    public abstract void sofwareStatement();
}

SoftwareA.java
public class SoftwareA extends Paysoftware {
    public  SoftwareA() {
        // TODO Auto-generated constructor stub
        super();
        super.setStrategy(new Zhifubao());
    }
    public void sofwareStatement() {
        System.out.println("我是软件A");
    }
        
    
}

SoftwareB.java
public class SoftWareB extends Paysoftware {

    public SoftWareB() {
        // TODO Auto-generated constructor stub
        super();
        super.setStrategy(new BankApp());
    }
    public void sofwareStatement() {
        System.out.println("我是软件B");
    }

}

 

 

  再定义一个测试类

TestDrive.java  
public class TestDrive {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Paysoftware softwarea=new SoftwareA();
        softwarea.sofwareStatement();
        softwarea.payInterface();

    }

}

  结果如下:

我是软件A
---请使用支付宝支付---

  这样我们就实现了策略模式。

 

posted @ 2018-04-23 18:10  Mugglean  阅读(177)  评论(0编辑  收藏  举报