Android设计模式—策略模式

1.策略模式
策略模式是一种行为型设计模式。它定义一系列的算法,并将每一个算法封装起来,并且它们可以相互替换。策略模式使算法独立于使用它的客户而独立变化。
策略模式提供了一组算法给客户端调用,使客户端能够根据不同的条件选择不同的策略来解决不同的问题。
if-else其实就是一个策略模式的体现,根据不同的选择处理不同的结果。但是如果把所有的方法全部用if-else(switch)来处理,从功能上说没问题,但是从代码层面的维护与使用来说,if-else多了之后会让类变的过于臃肿,不利于阅读,修改困难。因此可以使用策略模式定义一个统一的接口,每个不同的功能实现该接口做一个具体类,外部调用具体类来达到不同的结果。

策略模式应用场景:
①同一类型问题有多种处理方式,仅仅是具体的实现细节不同时,如各种排序算法等等。
②需要安全地封装多种同一类型的操作时。对客户隐藏具体行为的实现细节,彼此完全独立;提高算法的保密性与安全性。
③同一抽象类有多个子类,而又需要使用if-else或switch语句来选择具体行为时,使用策略模式把这些行为独立到具体的策略类中,可以避免多重选择的结构。

策略模式UML类图:
在这里插入图片描述
Context:策略上下文,用于操作策略的上下文
Strategy:抽象策略类
ConcreteStrategy:具体策略类

3.举例
策略模式包含一个策略接口和一组实现该接口的策略类。策略的创建由工厂类来完成,封装策略创建的细节。策略模式包含一组可选的策略,客户端如何选择使用哪个策略,有两种方法:编译时静态确定和运行时动态确定。其中,运行时动态确定才是策略模式最典型的应用场景。

有一个商品售卖,在售卖过程中,要根据不同的用户给予不同的价格(半价,9折,8折等等),这时可以使用策略模式来计算不同用户的价格。
①抽象策略类
public interface PriceStrategy {
int setPrice(int price);
}
②具体策略类
策略一:8折
public class eightPriceStrategy implements PriceStrategy {
@Override
public Double setPrice(int price) {
return 0.8 * price;
}
}
策略二:5折
public class HalfPriceStrategy implements PriceStrategy {
@Override
public Double setPrice(int price) {
return 0.5 * price;
}
}
③策略上下文
public class PriceAlgorithm {
private PriceStrategy priceStrategy;
public PriceStrategy getPriceStrategy() {
return priceStrategy;
}
public void setPriceStrategy(PriceStrategy priceStrategy) {
this.priceStrategy = priceStrategy;
}
public Double payPrice(int price) {
if(priceStrategy!=null){
return priceStrategy.setPrice(price);
}
return null;
}
}
传入具体的实现类,获取返回接口
④客户端
int price =20; //商品原价20元

PriceAlgorithm priceAlgorithm = new PriceAlgorithm();
priceAlgorithm.setPriceStrategy(new HalfPriceStrategy());
int halfPrice = priceAlgorithm.payPrice(price);
Log.e(TAG, “会员—商品半价:” + halfPrice);

PriceAlgorithm priceAlgorithm2 = new PriceAlgorithm();
priceAlgorithm2.setPriceStrategy(new eightPriceStrategy());
int eightPrice = priceAlgorithm2.getPprice price);
Log.e(TAG, “非会员—商品八折:” + halfPrice);

策略模式和工厂模式的区别:
在这里插入图片描述

4.优缺点
优点:
①策略类可以互相替换
由于策略类都实现同一个接口,因此它们能够互相替换。
②耦合度低,方便扩展
增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合开闭原则。
使用策略模式之后的维护只需要维护具体的实现类,如果有新增的方式,只需要扩展实现具体类即可,便于维护使用。
③避免使用多重条件选择语句(if-else或switch)。

缺点:
①策略的增多会导致子类也会变多
②客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

5.Android中的源码分析
①使用ListView时都需要设置一个Adapter,而这个Adapter根据实际的需求可以用ArrayAdapter、SimpleAdapter等,这里就运用到了策略模式。

抽象策略接口:
public interface ListAdapter extends Adapter {

}

具体策略类BaseAdapter:
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {

}

具体策略类ArrayAdapter:
public class ArrayAdapter extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {

}

策略上下文:
public class ListView extends AbsListView {
@Override
public void setAdapter(ListAdapter adapter){ //设置策略,即adapter
……
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值