Android经验分享Android知识Android开发

手把手教学,Android中的桥接模式

2016-09-21  本文已影响988人  四会歌神陈子豪

1.介绍

桥接模式,又称为桥梁模式,是结构型设计模式之一。在现实生活中大家都知道“桥梁”是连接河道两岸的主要交通枢纽,简而言之其作用就是连接河流的两边,而我们的桥接模式与现实中的情况很相似,也是承担着连接“两边”的作用。

2.使用场景

3.认识桥接模式

桥接模式角色图
角色介绍
从代码上看
public interface Implementor{
    //实现抽象部分的具体方法
    public void operationImpl();
}
public class ConcreteImplementorA implements Implementor{
   @Override
     public void operationImpl(){
        //具体的实现
    }
}
public class ConcreteImplementorB implements Implementor{
   @Override
     public void operationImpl(){
        //具体的实现
    }
}
public absteact class Abstraction{
    //生命一个私有成员变量引用实现部分的对象
    private Implementor mImplementor;
    
    //通过实现部分对象的引用构造抽象部分的对象
    public Abstraction (Implementor implementor) {
        mImplementor = implementor;
    }

    //通过调用实现部分具体的方法实现具体的功能
    public void operation(){
        mImplementor.operationImpl();
    }
}
public class RefinedAbstraction extends Abstraction{
    
    public RefinedAbstraction (Implementor implementor){
        super(implementor);
    }

    //对父类抽象部分中的方法进行扩展
    public void refinedOperation(){
        //对Abstraction中的方法扩展
    }
}
public class Client{
    public static void main(String[] args){
        //客户调用逻辑
    }
}

简单实现

简单设计一个场景,一般我们去吃牛排,服务员都会询问你,吃什么牛排,要加什么汁,几成熟。我们可以把“服务员”,“牛排”,“汁”,“几成熟”定义为桥接模式的成员:

Paste_Image.png

代码实现

public interface Steak {
    public void addSomething(String something);
}
public class FiletSteak implements Steak {
    @Override    public void addSomething(String something) {
        Log.i("mytag",something);
   }
}
public class SirloinSteak implements Steak {
    @Override
    public void addSomething(String something) {
        Log.i("mytag",something);
    }
}
public abstract class Orders {
    protected Steak impl;
    public Orders(Steak impl){
        this.impl = impl;
    }
   public void writeOrder(String something){
        this.impl.addSomething(something);
    }
}
public class Sauce extends Orders{
    public Sauce(Steak impl) {
        super(impl);
    } 
   @Override
    public void writeOrder(String sauce) {
        super.writeOrder(sauce);
    }
}
public class Cooked extends Orders {
    public Cooked(Steak impl) {
        super(impl);
    }
    @Override
    public void writeOrder(String cooked) {
        super.writeOrder(cooked);
    }
}
//服务员出场Log.i("mytag","客官请问想吃什么牛排");
//我选择菲力牛排
Steak steak = new FiletSteak();
steak.addSomething("菲力牛排");
Log.i("mytag","客官请问加什么汁");
//我选择黑椒汁
Orders orders = new Sauce(steak);
orders.writeOrder("黑椒汁");
Log.i("mytag","客官请问要几成熟");
//7成最好吃
orders = new Cooked(steak);
orders.writeOrder("七成熟");
//分隔线
Log.i("mytag","-------------------------");
//同理西冷牛排
Log.i("mytag","客官请问还想吃什么牛排");
steak = new SirloinSteak();
steak.addSomething("西冷牛排");
Log.i("mytag","客官请问加什么汁");
orders = new Sauce(steak);
orders.writeOrder("番茄汁");
Log.i("mytag","客官请问要几成熟");
orders = new Cooked(steak);
orders.writeOrder("全熟");

编译代码:

Paste_Image.png

Android源码中的桥接模式实现

桥接模式在Android中应用得相当广泛,但一般而言都是作用于大范围的,我们可以在源码中很多地方看到桥接模式的应用。例如我们常用的AdapterAdapterView之间就是一个桥接模式。
首先ListAdapter.java:

public interface ListAdapter extends Adapter{
     //继承自Adapter,扩展了自己的两个实现方法
     public boolean areAllItemsEnabled();
     boolean isEnabled(int position);
}

这里先来看一下父类AdapterView:

public abstract class AdapterView<T extends Adapter> extends ViewGroup {
     //这里需要一个泛型的
    Adapter public abstract T getAdapter();
    public abstract void setAdapter(T adapter);
 }

接着来看ListView的父类AbsListView,继承自AdapterView

public abstract class AbsListView extends AdapterView<ListAdapter>
     //继承自AdapterView,并且指明了T为ListAdapter
     /** * The adapter containing the data to be displayed by this view */
     ListAdapter mAdapter;
     //代码省略
     //这里实现了setAdapter的方法,实例了对实现化对象的引用
     public void setAdapter(ListAdapter adapter) {
     //这的adapter是从子类传入上来,也就是listview,拿到了具体实现化的对象
     if (adapter != null) {
         mAdapterHasStableIds = mAdapter.hasStableIds();
         if (mChoiceMode != CHOICE_MODE_NONE && mAdapterHasStableIds &&   mCheckedIdStates == null) {
             mCheckedIdStates = new LongSparseArray<Integer>();
         }
     }
     if (mCheckStates != null) {
         mCheckStates.clear();
    }
     if (mCheckedIdStates != null) {
         mCheckedIdStates.clear();
    }
 }

大家都知道,构建一个listview,adapter中最重要的两个方法,getCount()告知数量,getview()告知具体的view类型,接下来看看AbsListView作为一个视图的集合是如何来根据实现化对象adapter来实现的具体的view呢?

protected void onAttachedToWindow() {
    super.onAttachedToWindow();
     //省略代码
     //这里在加入window的时候,getCount()确定了集合的个数
     mDataChanged = true;
     mOldItemCount = mItemCount;
     mItemCount = mAdapter.getCount();
     
 }

接着来看

View obtainView(int position, boolean[] isScrap) {
     //代码省略
     ​//这里根据位置显示具体的view,return的child是从持有的实现对象mAdapter里面的具体实现的
     ​//方法getview来得到的。
     final View child = mAdapter.getView(position, scrapView, this);
     //代码省略 return child;
 }

接下来在ListView中,onMeasure调用了obtainView来确定宽高,在扩展自己的方法来排列这些view。知道了

这些以后,我们来画一个简易的UML图来看下:

以上就是Android源码中的桥接模式实现

桥接模式的优缺点

优点
缺点

最后放出一个链接,文中的Android源码中的模式实现就是出自此处:
http://blog.csdn.net/u010405231/article/details/49618511

关于桥接模式就介绍到这里,后面可能会看心情再介绍一下别的设计模式。


更多精彩文章请扫描下方二维码关注微信公众号"AndroidCzh":这里将长期为您分享原创文章、Android开发经验等!
QQ交流群: 705929135

上一篇 下一篇

猜你喜欢

热点阅读