美文网首页设计模式
设计模式-适配器模式

设计模式-适配器模式

作者: isLJli | 来源:发表于2020-05-14 18:21 被阅读0次

适配器模式的定义

适配器(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));
  }
}

相关文章

  • 简说设计模式之适配器模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是适配器模式 适配器模式(Adapter...

  • 设计模式 - 目录

    设计模式01 - 单例模式 设计模式02 - 工厂模式 设计模式03 - 建造者模式 设计模式04 - 适配器模式...

  • 最常用的设计模式---适配器模式(C++实现)

    适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式)。 适配器设计模式也并不复杂,适...

  • iOS设计模式(5)策略模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(6)模板模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(7)建造者模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(4)抽象工厂模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

  • iOS设计模式(1)简单工厂模式

    设计模式系列文章 《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器模式》《iOS设计模式(4)抽象工厂...

  • iOS设计模式(2)工厂模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(3)适配器模式》《iOS设计模式(4)抽象...

  • iOS设计模式(8)外观模式

    设计模式系列文章 《iOS设计模式(1)简单工厂模式》《iOS设计模式(2)工厂模式》《iOS设计模式(3)适配器...

网友评论

    本文标题:设计模式-适配器模式

    本文链接:https://www.haomeiwen.com/subject/gidjnhtx.html