目录
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
代码
//中国公民
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方案");
}
}