Android 策略模式学习

策略模式

这个模式定义了一系列的算法,并将每一个算法封装起来,而且使他们还可以相互替换.
策略模式让算法独立于使用他的客户而独立变化的

使用场景

1 针对一类型问题有多种处理方式,仅仅是具体行为有差别

2 需要 安全的封装多种同一类的操作

3 出现同一抽象类有多个子类 而有需要使用 if-else 或者 switch-case 来选择具体的子类的时候

自己的理解

其实就是模块化的步枪 可以通过换枪管 发射不同的子弹

代码中 SubwayStrategy 就是枪管

TranficCalculator 就是枪

代码:

/**
 * 价格计算器
 */
public class TranficCalculator {
    private CalculateStrategy mStrategy;
    public TranficCalculator(CalculateStrategy strategy) {
        mStrategy = strategy;
    }

    public int getPrice(int km) {
        return mStrategy.calculatePrice(km);
    }
}
/**
 * 计算接口
 */
public interface CalculateStrategy {
    int calculatePrice(int km);
}
/**
 * 公交车
 */
public class BusStrategy implements CalculateStrategy {
    @Override
    public int calculatePrice(int km) {
        int extraTotal = km - 10;
        int extraFactor = extraTotal / 5;
        int fraction = extraTotal % 5;
        int price = 1 + extraFactor * 1;
        price = fraction > 0 ? ++price : price;
        return price;
    }
}
/**
 * 地铁
 */
public class SubwayStrategy implements CalculateStrategy {
    @Override
    public int calculatePrice(int km) {
        if (km < 6) {
            return 3;
        }
        if (km < 12) {
            return 4;
        }
        if (km < 22) {
            return 5;
        }
        if (km < 32) {
            return 6;
        }
        return 7;
    }
}

使用:

public class MainActivity extends AppCompatActivity {

    private EditText mMainEt;
    private TranficCalculator calculator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        calculator = new TranficCalculator(new SubwayStrategy());


        mMainEt = findViewById(R.id.main_et);
        findViewById(R.id.main_bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String trim = mMainEt.getText().toString().trim();
                int i = Integer.parseInt(trim);
                int price = calculator.getPrice(i);
                Log.e("text123", "onCreate: price = " + price);
            }
        });
        
    }
}

具体代码地址:

https://github.com/zhoudakkk/design_pattern_day05.git

你可能感兴趣的:(Android 策略模式学习)