Java设计模式设计模式

《设计模式》策略模式

2019-08-08  本文已影响2人  敏捷Studio

定义

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

介绍

UML类图

策略模式UML类图

角色说明:

实现

以追妹纸为例,遇到不同的妹纸追求的套路(策略)是不一样的。

1、创建抽象策略类。定义公共接口,也就是追妹纸的过程:

// 追求策略
public interface ChaseStrategy {
  // 抽象追求方法
  void chase();
}

2、创建具体策略类。实现抽象策略类的接口,即具体的追求套路:

public class ShoppingStrategy implements ChaseStrategy {
  @Override
  public void chase() {
    System.out.println("一起逛街咯~");
  }
}

public class MoviesStrategy implements ChaseStrategy {
  @Override
  public void chase() {
    System.out.println("一起看电影咯~");
  }
}

public class EatingStrategy implements ChaseStrategy {
  @Override
  public void chase() {
    System.out.println("一起吃饭咯~");
  }
}

3、创建环境类。用来操作不同的策略,不同的妹纸使用不同的策略,随机应变:

public class Context {
  // 定义抽象策略类
  private ChaseStrategy chaseStrategy;

  // 构造方法传递具体策略对象过来
  public Context(ChaseStrategy chaseStrategy) {
    this.chaseStrategy = chaseStrategy;
  }
    
  // 执行具体策略对象的策略   
  public void chase() {
    chaseStrategy.chase();
  }
}

4、测试方法

public void test() { 
  Context context;
    
  System.out.println("遇到爱逛街的妹子:");
  context = new Context(new ShoppingStrategy());
  context.chase();

  System.out.println("遇到爱看电影的妹子:");
  context = new Context(new MoviesStrategy());
  context.chase();

  System.out.println("遇到吃货妹子:");
  context = new Context(new EatingStrategy());
  context.chase();
}

输出结果:

遇到爱逛街的妹子:
一起逛街咯~
遇到爱看电影的妹子:
一起看电影咯~
遇到吃货妹子:
一起吃饭咯~

应用场景

优缺点

优点

缺点

Android中的源码分析

之前我们用的ListView时都需要设置一个Adapter,而这个Adapter根据我们实际的需求可以用ArrayAdapter、SimpleAdapter等等,这里就运用到策略模式。

1、ListView的简单用法

ListView listView = (ListView) findViewById(R.id.list_view);
// 使用ArrayAdapter
listView.setAdapter(new ArrayAdapter<String>(this, R.id.item, new String[]{"one", "two"}));

// 使用BaseAdapter
listView.setAdapter(new BaseAdapter() {
  @Override
  public int getCount() {
    return 0;
  }

  @Override
  public Object getItem(int position) {
    return null;
  }

  @Override
  public long getItemId(int position) {
    return 0;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    return null;
  }
});

2、相关源码分析

// 相当于环境类
public class ListView extends AbsListView {
  // 设置策略,即adapter
  @Override
  public void setAdapter(ListAdapter adapter) {
    // 其他代码略
  }
}

// 抽象策略接口
public interface ListAdapter extends Adapter {
}
// 具体策略类BaseAdapter,实现ListAdapter接口
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
}
// 具体策略类ArrayAdapter,继承BaseAdapter,即实现ListAdapter接口
public class ArrayAdapter<T> extends BaseAdapter implements Filterable, ThemedSpinnerAdapter {  
}

3、总结

上一篇下一篇

猜你喜欢

热点阅读