设计模式

设计模式-适配器模式

2020-05-14  本文已影响0人  isLJli

适配器模式的定义

适配器(Adapter)模式就是将某一些对象转成我们需要的适配的对象。分为两种为类适配和对象适配。

小案例

一个项目在1.0版本只有人民币支付的方式,后在1.1版本加上了美金支付。现在使用适配器模式来适配美金支付。
类适配写法:
其实是通过继承来实现

1.0版本
public class RMBAdaptee {
  private float mRmb;

  public RMBAdaptee(float rmb){
      this.mRmb = rmb;
  }

  public float getRmb() {
      return mRmb;
  }
}

public void main(){
      RMBAdaptee mRMBAdaptee = new RMBAdaptee(560);
      float rmb = mRMBAdaptee.getRmb();
      System.out.println("需要支付人民币:"+rmb);
  }
1.1版本
public interface UsdTarget {
  float getUsd();
}


public class Adapter extends RMBAdaptee implements UsdTarget {

  public Adapter(float rmb) {
      super(rmb);
  }

  @Override
  public float getUsd() {
      return getRmb()/7.0f;
  }
}

public void main() {
      RMBAdaptee mRMBAdaptee = new RMBAdaptee(560);
      float rmb = mRMBAdaptee.getRmb();
      System.out.println("需要支付人民币:" + rmb);

      // 第二个版本要去兼容美元 ,采用适配器模式,
      Adapter adapter = new Adapter(560);
      float usd = adapter.getUsd();
      System.out.println("需要支付美元" + usd);
  }

对象适配写法
通过设置参数的写法

1.0版本
public class RMBAdaptee {
private float mRmb;

public RMBAdaptee(float rmb){
    this.mRmb = rmb;
}

public float getRmb() {
    return mRmb;
}
}

public void main(){
    RMBAdaptee mRMBAdaptee = new RMBAdaptee(560);
    float rmb = mRMBAdaptee.getRmb();
    System.out.println("需要支付人民币:"+rmb);
}
1.1版本
public interface UsdTarget {
  float getUsd();
}

public class Adapter implements UsdTarget {

  private RMBAdaptee mRMBAdaptee;

  public Adapter(RMBAdaptee mRMBAdaptee) {
      this.mRMBAdaptee = mRMBAdaptee;
  }

  @Override
  public float getUsd() {
      return mRMBAdaptee.getRmb()/7.0f;
  }
}

public void main(){
      com.haiming.adapterpattern.simple2.RMBAdaptee mRMBAdaptee = new RMBAdaptee(560);
      float rmb = mRMBAdaptee.getRmb();
      System.out.println("人民币:"+rmb);

      // 第二个版本要去兼容美元 ,采用适配器模式,
      Adapter adapter = new Adapter(mRMBAdaptee);
      float usd = adapter.getUsd();
      System.out.println("人名币换美元"+usd);
  }

RecyclerView的Adapte

这里写一个简易版的recyclerView说明适配器模式

public class SimpleRecyclerView extends ScrollView {
  private LinearLayout mContainer;
  private Adapter mAdapter;

  public SimpleRecyclerView(Context context) {
      this(context, null);
  }

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

  public SimpleRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);

      mContainer = new LinearLayout(context);
      mContainer.setOrientation(LinearLayout.VERTICAL);
      addView(mContainer, 0);
  }

  @Override
  public void addView(View child) {
      mContainer.addView(child);
  }

  /**
   * 对象适配
   *
   * @param recyclerViewAdapter
   */
  public void setAdapter(Adapter recyclerViewAdapter) {
      this.mAdapter = recyclerViewAdapter;
      int count = mAdapter.getCount();
      for (int i = 0; i < count; i++) {
          View childView = mAdapter.onCreateViewHolder(i, mContainer);
          addView(childView);
      }
  }
  
  public interface Adapter{
      int getCount();

      View onCreateViewHolder(int position, ViewGroup parent);
  }
}

/**
* 具体的适配器
* 把数据集合适配成View--对象适配
*/
public class RecyclerViewAdapter implements SimpleRecyclerView.Adapter {

  public List<String> mItems;
  private Context mContext;

  public RecyclerViewAdapter(Context context, List<String> mItems) {
      this.mItems = mItems;
      this.mContext = context;
  }

  @Override
  public int getCount() {
      return mItems.size();
  }


  @Override
  public View onCreateViewHolder(int position, ViewGroup parent) {
      TextView itemView = (TextView) LayoutInflater.from(mContext)
              .inflate(R.layout.item_layout,parent,false);

      itemView.setText(mItems.get(position));

      return itemView;
  }
}
public class MainActivity extends AppCompatActivity {

  private SimpleRecyclerView mListView;

  private List<String> mDatas = new ArrayList<>();

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      mListView = findViewById(R.id.simple_list_view);

      for (int i=0;i<100;i++){
          mDatas.add(""+i);
      }
      
      mListView.setAdapter(new RecyclerViewAdapter(this,mDatas));
  }
}
上一篇下一篇

猜你喜欢

热点阅读