Android开发

Android中的设计模式之策略模式

2018-04-03  本文已影响6人  WangGavin

参考

处理新需求的一种途径

考虑变化的设计

例子1:国际电子商务系统

这个系统的总架构中有一个控制器对象,用于处理销售请求。他能够确认何时有人在请求销售订单,并将请求转发给SalesOrder对象进行订单处理。

总架构中的SalesOrder

SalesOrder对象的功能包括:

当然这些功能可以借助其他对象去实现,他的作用应该是充当一个存在销售订单信息的容器。

处理新的需求

比如必须处理美国之外的顾客的订单税额。
那么我们至少需要添加新的税额计算规则

那么该怎样添呢?

比如:


继承方案

这种方案的困难之处在于,它这次能够凑效,但是无法次次凑效,比如,如果要处理德国订单,或者应对其他方面发生变化(如日期格式,语言和运费规则),我们构建的继承层次将无法轻松应对

使用策略模式方法

第一步 发现变化并封装之

在本例中,已经确定缴税规则是变化的,“将它封装”就应该创建一个抽象类定义如何在概念上完成税额计算,然后根据每种变化派生具体类。

封装变化

第二步 组合优先

应该使用组合代替继承,用组合包含变化,也就是说,只有一个SalesOrder类,让它包含处理变化的CalcTax类

组合代替继承

直接继承方和策略模式方案比较

一个是自己直接派生处理变化,另一个是包含引用指向变化,当然是后一种好,因为一些税额业务规则能更好的独立于使用自己的SalesOrder

《设计模式》中的Strategy 模式

意图

可以根据上下文,使用不同的业务规则或算法

解释

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,Strategy模式使算法可独立于使用它的客户而变化。

原则

角色

示例代码

public class PriceCalculator {
private Stragety stragety;
    public void setStragety(Stragety stragety){
        this.stragety=stragety;
    }
    
public void calculatePrice(int km) {
    int price=0;
    if (stragety!=null) {
        price=stragety.calculatePrice(km);
    }
    System.out.println(String.valueOf(price));
}
}
public class Bus implements Stragety{
    @Override
    public int calculatePrice(int km) {
        return 3*km;
    }
    
}
public class Subway implements Stragety{
    
    @Override
    public int calculatePrice(int km) {
        return 5*km;
    }
    
}
public class Taxi implements Stragety{
    
    @Override
    public int calculatePrice(int km) {
        return 2*km;
    }
    
}
    public static void main(String[] args) {
        PriceCalculator laowang=new PriceCalculator();
        laowang.setStragety(new Bus());
        laowang.calculatePrice(3);
        laowang.setStragety(new Subway());
        laowang.calculatePrice(3);
        laowang.setStragety(new Taxi());
        laowang.calculatePrice(3);
    }

效果

使用if-else暴露的问题是代码臃肿,逻辑复杂,难以升级和维护,没有结构可言;策略模式是通过建立抽象,将不同的策略构建成一个具体的策略实现,通过不同的策略实现算法替换。在简化逻辑,结构的同时,增强了系统的可读性,稳定性,可扩展性。

应用例子2 Android动画中的时间插值器

待研究

上一篇 下一篇

猜你喜欢

热点阅读