迭代器模式

2017-11-06  本文已影响0人  Ayres

一、定义

提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

二、UML图

三、简单实现

①迭代器接口
public interface Iterator<T> {
/**
 * 是否还有下一个元素
 * @return true表示有 ,false表示没有
 */
boolean hasNext();

/**
 * 返回当前位置的元素并将位置移至下一位
 * @return
 */
T next();
}
②具体迭代器类
public class ConcreteIterator<T> implements Iterator<T> {

 private List<T> list=new ArrayList<>();
private int cursor=0;
public ConcreteIterator(List<T> list){
    this.list=list;
}
@Override
public boolean hasNext() {
    return cursor!=list.size();
}

@Override
public T next() {
    T obj=null;
    if (this.hasNext()){
        obj=this.list.get(cursor++);
    }
    return obj;
}
}
③容器接口
public interface Aggregate<T> {
void add(T obj);
void remove(T obj);
Iterator<T> iterator();
 }
④具体容器类
public class ConcreteAggregate<T> implements Aggregate<T> {
private List<T> list= new ArrayList<T>();
 @Override
 public void add(T obj) {
    list.add(obj);
 }

@Override
public void remove(T obj) {
    list.remove(obj);
}

@Override
public Iterator<T> iterator() {
    return new ConcreteIterator<T>(list);
}
}
⑤使用
   Aggregate<String> objectConcreteAggregate = new ConcreteAggregate<>();
    objectConcreteAggregate.add("1111");
    objectConcreteAggregate.add("222");
    objectConcreteAggregate.add("333");
    Iterator<String> iterator = objectConcreteAggregate.iterator();
    while (iterator.hasNext()){
        Log.e("tag",iterator.next());
    }

四、自定义View,使用迭代器模式

①创建适配器
 public interface TabIterator {
    BottomTabItem next();
    boolean hashNext();
  }

实现类

public class TabListIterator<T extends BottomTabItem>  implements TabIterator {
private final ArrayList<T> items;
private int index;

public TabListIterator(){

    items = new ArrayList<>();
}

public void addItem(T item){

    items.add(item);

}
@Override
public BottomTabItem next() {
    return items.get(index++);
}
@Override
public boolean hashNext() {
    return index<items.size();
}
}
②创建容器类
public abstract class BottomTabItem {

 private View mTabItemView;
 private int mLayoutId;
 private Context mContext;

 public BottomTabItem(int layoutId,Context context){
          this.mLayoutId=layoutId;
          this.mContext=context;
  }
  public View getTabView(){


   if(mTabItemView == null){
       mTabItemView = LayoutInflater.from(mContext).inflate(mLayoutId,null);
       initLayout();
   }
   return mTabItemView;
}
/**
 * 初始化显示
 */
protected abstract void initLayout();

protected <T> T findViewById(int id){
    return (T)mTabItemView.findViewById(id);
}

/**
 * 是否选择当前条目
 * @param selected
 */
protected abstract void setSelected(boolean selected);
 }

实现类

public class MainBottomTabItem extends BottomTabItem {

private Builder mBuilder;
private MainBottomTabItem(Context context) {
    super(R.layout.tab_main_bottom_item, context);
}
public MainBottomTabItem(Builder builder){
     this(builder.context);
    this.mBuilder=builder;

}
@Override
protected void initLayout() {

    TextView tabText = findViewById(R.id.tab_text);
    ImageView tabIcon = findViewById(R.id.tab_icon);


    if(!TextUtils.isEmpty(mBuilder.text)){
        tabText.setText(mBuilder.text);
    }
    if(mBuilder.resIconId != 0){
        tabIcon.setImageResource(mBuilder.resIconId);
    }
}

@Override
protected void setSelected(boolean selected) {


    TextView tabText = findViewById(R.id.tab_text);
    ImageView tabIcon = findViewById(R.id.tab_icon);

    tabText.setSelected(selected);
    tabIcon.setSelected(selected);
}

public static class Builder{

    Context context;
    String text;
    int resIconId;

    public Builder(Context context){
        this.context = context;
    }

    public Builder text(String text){
        this.text = text;
        return this;
    }

    public Builder resIcon(int resIconId){
        this.resIconId = resIconId;
        return this;
    }

    public MainBottomTabItem create(){
        return new MainBottomTabItem(this);
    }
  }
}
③自定义view
public class TabBottomNavigation extends LinearLayout {


private List<BottomTabItem> mTabItems;
private int mCurrentIndex = -1;
public TabBottomNavigation(Context context) {
    this(context,null);
}

public TabBottomNavigation(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public TabBottomNavigation(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    //设置水平排列
    setOrientation(HORIZONTAL);
    mTabItems = new ArrayList<>();
}

public void addTabItem(TabIterator tabIterator){
    mTabItems.clear();
    // 当前的位置
    int index = 0;
    while (tabIterator.hashNext()){

        BottomTabItem tabItem = tabIterator.next();
        View tabView = tabItem.getTabView();
        addView(tabView);

        LinearLayout.LayoutParams params = (LayoutParams) tabView.getLayoutParams();
        params.weight = 1;
        params.gravity = Gravity.CENTER;
        tabView.setLayoutParams(params);

        // 给条目设置点击事件,等等
        setItemClickListener(tabView,index++);
        mTabItems.add(tabItem);
    }

    // 第一个位置要设置为选中
    mTabItems.get(0).setSelected(true);
    mCurrentIndex = 0;
}
private void setItemClickListener(View tabView, final int position) {
    tabView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mCurrentIndex != position){
                // 原来的标为非选中
                mTabItems.get(mCurrentIndex).setSelected(false);
                // 把当前设置为选中
                mCurrentIndex = position;
                mTabItems.get(mCurrentIndex).setSelected(true);
                // 把点击的为用接口回调出去供外部使用,调整显示
            }
        }
    });
  }
 }
④使用
   TabListIterator<MainBottomTabItem> listIterator = new TabListIterator<>();
    listIterator.addItem(new MainBottomTabItem.Builder(this)
          .resIcon(R.drawable.main_tab_item).text("text1").create());
    listIterator.addItem(new MainBottomTabItem.Builder(this)
           .resIcon(R.drawable.main_tab_item).text("text2").create());
    listIterator.addItem(new MainBottomTabItem.Builder(this)
            .resIcon(R.drawable.main_tab_item).text("text3").create());

     mTabBottomNavigation.addTabItem(listIterator);
上一篇下一篇

猜你喜欢

热点阅读