23种设计模式之策略模式

优点:算法可自由切换,避免了多重条件判断,扩展性良好,符合开闭原则。
缺点:算法多了,类也增多,每个算法都会形成一个类,而且每个算法必须对上层暴露。

主要用于分离算法,选择实现。

角色:

  • Context封装角色,也叫作上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能的变化。

  • Strategy抽象策略角色,策略算法家族的抽象,通常为接口定义每个算法必须具有的方法和属性。

  • ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法。

例子从简:模仿报价,A类型客户不打折,B类型客户打9折,C类型客户打8折,D类型客户打7折。

创建抽象策略角色(Strategy):

/**
 * Strategy抽象策略角色,策略算法家族的抽象,通常为接口定义每个算法必须具有的方法和属性。
 */

public interface Strategy {
    double getPrice(double price);
}

创建A、B、C、D四个具体策略角色(ConcreteStrategy):

import android.util.Log;

/**
 * ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
 * A类型客户
 */

public class ConcreteStrategyA implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "A类型客户,不打折");
        return price;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
 * B类型客户
 */

public class ConcreteStrategyB implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "B类型客户,打九折");
        return price * 0.9;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
 * C类型客户
 */

public class ConcreteStrategyC implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "C类型客户,打八折");
        return price * 0.8;
    }
}
import android.util.Log;

/**
 * ConcreteStrategy具体策略角色,实现抽象策略中的操作该类含有具体的算法
 * D类型客户
 */

public class ConcreteStrategyD implements Strategy {

    @Override
    public double getPrice(double price) {
        Log.d("TAG", "D类型客户,打七折");
        return price * 0.7;
    }
}

创建Context封装角色:

/**
 * Context封装角色,也叫作上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能的变化。
 */

public class StrategyContext {

    private Strategy strategy;

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

    public double getPrice(double price) {
        return strategy.getPrice(price);
    }
}

调用:

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

/**
 * 这是调用者
 */

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //假设客户类型为C类客户
        StrategyContext context = new StrategyContext(new ConcreteStrategyC());
        double price = context.getPrice(10000);
        Log.d("TAG", "报价为:" + price);
    }
}

结果:
image.png

已完成测试!有不对的地方欢迎指出,感恩。

你可能感兴趣的:(23种设计模式之策略模式)