策略模式

目录

https://blog.csdn.net/dongganen/article/details/79688794


定义策略模式


定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

案例分析


前几天看到一个新闻,国家要提高税收线,真是利国利民。
作为一个中国公民我们应该依法缴税。

使用继承


代码
//中国公民
class Chinese{

    private Double income;

    //依法缴税
    public double payTaxes(double income){
        return income * .10;
    }

    public Double getIncome() {
        return income;
    }

    public void setIncome(Double income) {
        this.income = income;
    }
}

//公民张三
class Zhangsan extends Chinese{
    public Zhangsan(double income){
        setIncome(income);
    }
}

//公民李四
class Lisi extends Chinese{
    public Lisi(double income){
        setIncome(income);
    }
}
分析

现在是所有中国公民缴税10%,那其实这样很不合理,高收入者多缴税,低收入者少缴税,这样贫富差距才不会拉大,这样才合理。

我们假设 5000 缴税 10%
我们假设 10000 缴税 15%
我们假设 15000 缴税 20%
为了方便就这么算了,因为个人收入不同,缴税也不同,所以继承无法解决问题。
这样我就抽取一个缴税的接口,每个中国公民去实现这个接口,个人按照自己的情况去缴税。

代码

//中国公民
class Chinese{

    private Double income;

    public Double getIncome() {
        return income;
    }

    public void setIncome(Double income) {
        this.income = income;
    }
}

interface PayTaxes{
    Double payTaxes();
}

//公民张三
class Zhangsan extends Chinese implements PayTaxes{

    public Zhangsan(double income){
        setIncome(income);
    }

    @Override
    public Double payTaxes() {
        return getIncome() * .10;
    }
}

//公民李四
class Lisi extends Chinese implements PayTaxes{
    public Lisi(double income){
        setIncome(income);
    }

    @Override
    public Double payTaxes() {
        return getIncome() * .15;
    }
}
分析

张三收入6000,缴税10%
李四收入11000,缴税20%
虽然这样看起解决问题了,但是有一个很大的问题就是代码没有复用,王五收入属于一档需要缴税10%,也需要实现和张三一样的逻辑,而且改动比较麻烦,随着社会发展,5000 - 10000只需缴税3%,那以前5%都要改成3%,维护成本太高。

使用设计模式


UML

image

代码
//中国公民
abstract class Chinese {

    protected PayTaxes payTaxes;
    private Double income;

    public double PayTaxes(){
        return payTaxes.payTaxes(getIncome());
    }

    public void setPayTaxes(PayTaxes payTaxes) {
        this.payTaxes = payTaxes;
    }

    public Double getIncome() {
        return income;
    }

    public void setIncome(Double income) {
        this.income = income;
    }


}

//缴税接口
interface PayTaxes{
    Double payTaxes(double income);
}

//一档 5000 - 10000
class PayTaxes1 implements PayTaxes{

    @Override
    public Double payTaxes(double income) {
        return income * .10;
    }
}

//二档 10000 - 15000
class PayTaxes2 implements PayTaxes{

    @Override
    public Double payTaxes(double income) {
        return income * .15;
    }
}

//三档 15000 - 20000
class PayTaxes3 implements PayTaxes{

    @Override
    public Double payTaxes(double income) {
        return income * .20;
    }
}


//公民张三
class Zhangsan extends Chinese{

    public Zhangsan(double income){
        super.income = income;
        super.payTaxes = new PayTaxes1();
    }
}

//公民李四
class Lisi extends Chinese {

    public Lisi(double income){
        super.income = income;
        super.payTaxes = new PayTaxes2();
    }
}

分析

个人按个人的情况缴税,还可以动态改变策略,发年终奖了可能缴税更多

//简单小案例
public class SimpleDemo {

    public static void main(String[] args) {
        Context context = new Context(null);
        //算法变化独立于客户
        context.setStrategy(new StrategyC());
        context.execution();
    }
}

//使用算法的客户
class Context {

    private Strategy strategy;

    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public void execution() {
        strategy.operate();
    }

    //算法互相替换
    public void setStrategy(Strategy strategy){
        this.strategy = strategy;
    }
}

//算法
interface Strategy{
    void operate();
}

//算法A
class StrategyA implements Strategy {

    @Override
    public void operate() {
        System.out.println("A方案");
    }
}

//算法B
class StrategyB implements Strategy {

    @Override
    public void operate() {
        System.out.println("B方案");
    }
}

//算法C
class StrategyC implements Strategy {

    @Override
    public void operate() {
        System.out.println("C方案");
    }
}

参考《Head First设计模式》


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值