`

设计模式之策略模式

阅读更多

策略模式就是定义一组算法,将每个算法都封装起来,并且是他们之间可以互换

 



 

通过类图可以知道,策略模式设计到如下三个角色

1.Context封装角色

它也叫上下文角色,其作用就是用来封装高层模块对策略的直接访问,封装可能存在的变化

 

2.Strategy抽象策略角色

策略的抽象,定义每个算法或策略必须具有的方法和属性

 

3.ConcreteStrategy 具体策略角色

实现抽象策略中的操作

 

下面是上述类图的代码实现:

/**
 * 
 * 抽象策略角色
 * 
 */
public abstract class Strategy {

    // 抽象算法
    public abstract void exec();
}

 

public class ConcreteStragegyA extends Strategy {

    /**
     * 
     * @see com.huashao.chapter.chapter18.ch01.Strategy#exec()
     */
    @Override
    public void exec() {

        System.out.println("ConcreteStragegyA");
    }

}

 

public class ConcreteStragegyB extends Strategy {

    /**
     * 
     * @see com.huashao.chapter.chapter18.ch01.Strategy#exec()
     */
    @Override
    public void exec() {

        System.out.println("ConcreteStragegyB");
    }

}

 

public class ConcreteStragegyC extends Strategy{

    /**
     * 
     * @see com.huashao.chapter.chapter18.ch01.Strategy#exec()
     */
    @Override
    public void exec() {

        System.out.println("ConcreteStragegyC");
    }

}

 

public class Context {

    private Strategy strategy;

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

    public void action() {

        strategy.exec();
    }
}

 

记得有位名人曾经说,人只有两件事没有办法逃避,那就是交税和死亡。

 

应纳个人所得税税额= 应纳税所得额× 适用税率- 速算扣除数
扣除标准3500元/月(2011年9月1日起正式执行)(工资、薪金所得适用)
个税免征额3500元  (工资薪金所得适用)


 
其实缴纳税额的计算就可以用策略模式实现,每一个等级的计算看做一种策略
例如:某人某月工资减去社保个人缴纳金额和住房公积金个人缴纳金额后为5500 元,个税计算:(5500-3500)*10%-105=95元
类图如下:


 
 
代码如下:
/**
 * 税收计算器
 * 
 */
public abstract class TaxCalculator {

    // 计算税收的方法
    protected abstract void calculate(int amount);
}
 
/**
 * 等级为1的收税计算
 * 全月应纳税所得额不超过1500
 */
public class Level01 extends TaxCalculator {

    /**
     * @param amount
     * @see com.huashao.chapter.chapter18.c02.TaxCalculator#calculate(int)
     */
    @Override
    protected void calculate(int amount) {

        // 为了简单计算不考虑小数
        int tax = amount * 3 / 100 - 0;
        System.out.println("应交税: " + tax);
    }

}
 
/**
 * 等级2:全月应纳税额在1500-4500
 *
 */
public class Level02 extends TaxCalculator {

    /**
     * @param amount
     * @see com.huashao.chapter.chapter18.c02.TaxCalculator#calculate(int)
     */
    @Override
    protected void calculate(int amount) {

        // 为了简单计算不考虑小数
        int tax = amount * 10 / 100 - 105;
        System.out.println("应交税: " + tax);
    }

}
 
/**
 * 
 *等级3:全月应纳税额在4500-9000
 */
public class Level03 extends TaxCalculator {

    /**
     * @param amount
     * @see com.huashao.chapter.chapter18.c02.TaxCalculator#calculate(int)
     */
    @Override
    protected void calculate(int amount) {

        // 为了简单计算不考虑小数
        int tax = amount * 20 / 100 - 555;
        System.out.println("应交税: " + tax);
    }

}
 
public class Context {

    private TaxCalculator taxcal;

    public Context(TaxCalculator taxcal) {

        this.taxcal = taxcal;
    }

    // 计算税收
    public void calculate(int amount) {
        taxcal.calculate(amount);
    }
}
 
其实看上面的策略模式,可以看到它有一个缺点就是客户端必须知道所有的策略,能否不需要客户端知道所有策略也能得到想要的答案呢?答案当然是肯定,下面我们利用前面说的工厂模式修改一下,客户端只需要输入一个金额,程序便返回正确的税收值,类图如下:
 


 
代码如下:
/**
 * 税收等级
 * 
 */
public class Level {

    private int amount;

    private String level;

    public Level(int amount) {

        this.amount = amount - 3500;

        if (this.amount <= 1500) {
            level = "A";
        } else if (this.amount <= 4500) {
            level = "B";
        } else if (this.amount <= 9000) {
            level = "C";
        }
    }

    public int getAmount() {
        return amount;
    }

    public String getLevel() {
        return level;
    }

}
 
/**
 * 税收策略工厂
 * 
 */
public abstract class TaxFactory {

    protected abstract TaxCalculator createTaxCal(Level level);
}
 
/**
 * 
 */
public class TaxCalFactory extends TaxFactory {

    /**
     * @param level
     * @return
     */
    @Override
    protected TaxCalculator createTaxCal(Level level) {

        if ("A".equalsIgnoreCase(level.getLevel())) {
            return new Level01();
        }

        if ("B".equalsIgnoreCase(level.getLevel())) {
            return new Level02();
        }

        if ("C".equalsIgnoreCase(level.getLevel())) {
            return new Level03();
        }

        return null;
    }

}
 
public class Client {

    public static void main(String[] args) {
        
        Level level=new Level(4000);
        
        TaxFactory factory=new TaxCalFactory();
        
        TaxCalculator calculator=factory.createTaxCal(level);
        
        calculator.calculate(level.getAmount());
        
                
    }
}
 
  • 大小: 56.6 KB
  • 大小: 19.9 KB
  • 大小: 44.5 KB
  • 大小: 50 KB
分享到:
评论

相关推荐

    设计模式之策略模式 鸭子问题

    设计模式之策略模式 鸭子问题 策略模式是一种经典的设计模式,通过鸭子问题,可以让学习者更好地了解设计模式的概念和实现。策略模式的主要思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。...

    设计模式之策略模式,商场收银,封装算法

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或场景来执行不同算法的情况。策略模式就是为了解决这类问题而提出的,它将每种算法封装到具有共同接口...

    55-Java设计模式之策略模式与状态模式1

    Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...

    设计模式之策略模式源码

    在给定的"设计模式之策略模式源码"工程中,我们可以看到通过一个简单的收银系统来展示策略模式的应用。收银系统是一个常见的业务场景,其中可能涉及多种结算策略,如折扣、满减、会员优惠等。通过策略模式,我们可以...

    设计模式之策略模式(附demo)

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件工程中,我们经常遇到需要根据不同的条件或时间点执行不同策略的情况。策略模式允许我们将算法族封装到各自独立的类中,使得它们可以互换使用,...

    设计模式之策略模式Android计算器实例

    在这个"设计模式之策略模式Android计算器实例"中,我们将探讨如何在Android应用中使用策略模式来实现一个计算器的功能。 首先,策略模式的核心思想是定义一系列算法,并将每个算法封装起来,使它们可以互相替换。...

    Java设计模式之策略模式

    **策略模式**是Java设计模式中的行为模式之一,它的核心思想是定义一系列的算法,并将每一个算法封装起来,使它们可以相互替换。这种模式让算法的变化独立于使用算法的客户。在Java编程中,策略模式常用于处理那些...

    python 设计模式之策略模式

    python 设计模式之策略模式

    设计模式 之 策略模式 使用c#实现

    在这个"设计模式 之 策略模式 使用c#实现"的案例中,我们将探讨如何在上传收银系统这样的实际场景中应用策略模式。 首先,我们需要理解策略模式的核心概念:策略(Strategy)接口定义了一族算法,实现了策略接口的...

    java设计模式之策略模式

    在"java设计模式之策略模式"的学习中,我们可以通过一个简单的例子来理解它的应用。例如,在一个软件系统中,我们可能需要对不同的数据进行排序,不同的排序算法(如冒泡排序、快速排序、插入排序等)可以被视为策略...

    设计模式之策略模式讲解ppt

    设计模式之策略模式讲解ppt,完整代码详见:https://blog.csdn.net/sinat_35866463/article/details/89094887

    [行为模式] head first 设计模式之策略模式(strategy)

    **策略模式**是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 策略模式包含三个主要角色: 1. **策略接口(Strategy...

Global site tag (gtag.js) - Google Analytics