策略模式(strategy)--模板方法模式(Template Method)

13、策略模式(strategy)

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:

图中ICalculator提供统一的方法,
AbstractCalculator是辅助类,提供辅助方法,

public interface ICalculator {  

    public int calculate(String exp);  

}  

public abstract class AbstractCalculator {  

    public int[] split(String exp,String opt){  

        String array[] = exp.split(opt);  

        int arrayInt[] = new int[2];  

        arrayInt[0] = Integer.parseInt(array[0]);  

        arrayInt[1] = Integer.parseInt(array[1]);  

        return arrayInt;  

    }  

}  

public class Plus extends AbstractCalculator implements ICalculator {  

    @Override  

    public int calculate(String exp) {  

        int arrayInt[] = split(exp,"\\+");  

        return arrayInt[0]+arrayInt[1];  

    }  

}  

public class Minus extends AbstractCalculator implements ICalculator {  

    @Override  

    public int calculate(String exp) {  

        int arrayInt[] = split(exp,"-");  

        return arrayInt[0]-arrayInt[1];  

    }  

}  

public class Multiply extends AbstractCalculator implements ICalculator {  

    @Override  

    public int calculate(String exp) {  

        int arrayInt[] = split(exp,"\\*");  

        return arrayInt[0]*arrayInt[1];  

    }  

}  

public class StrategyTest {  

    public static void main(String[] args) {  

        String exp = "2+8";  

        ICalculator cal = new Plus();  

        int result = cal.calculate(exp);  

        System.out.println(result);  

    }  

}  

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

14、模板方法模式(Template Method)

一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用:

在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用:

public abstract class AbstractCalculator {  

    /*主方法,实现对本类其它方法的调用*/  

    public final int calculate(String exp,String opt){  

        int array[] = split(exp,opt);  

        return calculate(array[0],array[1]);  

    }  

    /*被子类重写的方法*/  

    abstract public int calculate(int num1,int num2);  

    public int[] split(String exp,String opt){  

        String array[] = exp.split(opt);  

        int arrayInt[] = new int[2];  

        arrayInt[0] = Integer.parseInt(array[0]);  

        arrayInt[1] = Integer.parseInt(array[1]);  

        return arrayInt;  

    }  

}  

public class Plus extends AbstractCalculator {  

    @Override  

    public int calculate(int num1,int num2) {  

        return num1 + num2;  

    }  

}  

public class StrategyTest {  

    public static void main(String[] args) {  

        String exp = "8+8";  

        AbstractCalculator cal = new Plus();  

        int result = cal.calculate(exp, "\\+");  

        System.out.println(result);  

    }  

}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值