23种设计模式-桥接模式(安卓应用场景介绍)

Posted 枫Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式-桥接模式(安卓应用场景介绍)相关的知识,希望对你有一定的参考价值。

概念

桥接模式是一种结构型设计模式,它通过将抽象与其实现分离来解耦。它使用接口(抽象类)作为桥梁,将一个抽象类与其实现类的代码分别独立开来,从而使它们可以各自独立地变化。桥接模式的核心思想是“组合优于继承”。

示例

为了更好地理解桥接模式,我们来看一个简单的示例:假设有一个形状类,其中有一个颜色属性。此时,如果我们使用继承来实现不同颜色的形状类,就需要创建许多子类,使代码结构变得复杂且难以维护。而使用桥接模式,则可以将形状和颜色分别抽象出来,从而将它们独立开来。

下面是一个简单的代码示例:

public interface Color 
    String getColor();


public class Red implements Color 
    @Override
    public String getColor() 
        return "红色";
    


public class Blue implements Color 
    @Override
    public String getColor() 
        return "蓝色";
    


public abstract class Shape 
    protected Color color;

    public Shape(Color color) 
        this.color = color;
    

    public abstract void draw();


public class Rectangle extends Shape 
    public Rectangle(Color color) 
        super(color);
    

    @Override
    public void draw() 
        System.out.println("绘制一个" + color.getColor() + "的矩形");
    


public class Circle extends Shape 
    public Circle(Color color) 
        super(color);
    

    @Override
    public void draw() 
        System.out.println("绘制一个" + color.getColor() + "的圆形");
    

在上面的代码中,我们首先定义了一个颜色接口,并分别实现了红色和蓝色。然后,我们定义了一个抽象的形状类,其中有一个颜色属性和一个抽象方法draw()。最后,我们实现了具体的矩形和圆形类,并在构造函数中传入了一个颜色对象。

这样,我们就将形状和颜色分别抽象出来,从而实现了解耦。当我们需要创建不同颜色的形状时,只需要创建不同颜色的对象并传入即可。

android应用

在Android应用开发中,桥接模式通常用于将业务逻辑和UI分离。例如,在MVP(Model-View-Presenter)模式中,Presenter通常充当桥接的角色,将View和Model分离开来。Presenter通过接口(抽象类)与View进行交互,并通过Model来获取数据。

下面是一个简单的MVP示例:

public interface LoginView 
    void showProgress();
    void hideProgress();
    void setUsernameError();
    void setPasswordError();
    void navigateToHome();


public interface LoginPresenter 
    void validateCredentials(String username, String password);


public class LoginPresenterImpl implements LoginPresenter 
    private LoginView loginView;
    private LoginModel loginModel;

    public LoginPresenterImpl(LoginView loginView) 
        this.loginView = loginView;
        loginModel = new LoginModelImpl();
    

    @Override
    public void validateCredentials(String username, String password) 
        if (TextUtils.isEmpty(username)) 
            loginView.setUsernameError();
            return;
        

        if (TextUtils.isEmpty(password)) 
            loginView.setPasswordError();
            return;
        

        loginView.showProgress();

        loginModel.login(username, password, new LoginModel.OnLoginFinishedListener() 
            @Override
            public void onUsernameError() 
                loginView.hideProgress();
                loginView.setUsernameError();
            

            @Override
            public void onPasswordError() 
                loginView.hideProgress();
                loginView.setPasswordError();
            

            @Override
            public void onSuccess() 
                loginView.hideProgress();
                loginView.navigateToHome();
            
        );
    


public interface LoginModel 
    interface OnLoginFinishedListener 
        void onUsernameError();
        void onPasswordError();
        void onSuccess();
    

    void login(String username, String password, OnLoginFinishedListener listener);


public class LoginModelImpl implements LoginModel 
    @Override
    public void login(final String username, final String password, final OnLoginFinishedListener listener) 
        new Handler().postDelayed(new Runnable() 
            @Override
            public void run() 
                if (username.equals("user") && password.equals("password")) 
                    listener.onSuccess();
                 else if (!TextUtils.isEmpty(username)) 
                    listener.onPasswordError();
                 else 
                    listener.onUsernameError();
                
            
        , 2000);
    

在上面的代码中,我们定义了一个LoginView接口,其中包含了一些用于显示UI的方法。然后,我们定义了一个LoginPresenter接口,它与LoginView接口相连,并通过LoginModel来获取数据。最后,我们实现了具体的LoginPresenterImpl和LoginModelImpl类。

通过这种方式,我们将UI和业务逻辑分开,从而使代码结构更清晰,易于维护。

源码解析

在Android源码中,桥接模式也有广泛的应用。例如,在View系统中,View和ViewGroup之间就采用了桥接模式来实现解耦。

在View系统中,View是Android系统中的基本UI组件,而ViewGroup则是一种容器组件,用于将多个View组合在一起。在这两个组件中,都有一个名为LayoutParams的内部类,用于描述组件的布局参数。

在早期的Android版本中,View和ViewGroup之间是通过继承来实现布局参数的传递的。但是这样会导致代码结构复杂且难以维护,因此在Android 2.2版本中,Google采用了桥接模式来重构View系统,从而使其更加灵活和易于维护。

下面是一个简单的代码示例,展示了View和ViewGroup之间是如何通过桥接模式来传递布局参数的:

public class View 
    private LayoutParams mLayoutParams;

    public void setLayoutParams(LayoutParams params) 
        mLayoutParams = params;
    

    public LayoutParams getLayoutParams() 
        return mLayoutParams;
    

    public static class LayoutParams 
        // 布局参数的属性
    


public class ViewGroup extends View 
    private ArrayList<View> mChildList = new ArrayList<>();

    public void addView(View child) 
        mChildList.add(child);
        child.setParent(this);
    

    public void removeView(View child) 
        mChildList.remove(child);
        child.setParent(null);
    

    public void removeAllViews() 
        for (View child : mChildList) 
            child.setParent(null);
        
        mChildList.clear();
    

    public static class LayoutParams extends View.LayoutParams 
        // 布局参数的属性
    

在上面的代码中,我们首先定义了一个View类,并在其中包含了一个LayoutParams内部类。然后,我们定义了一个ViewGroup类,它继承自View,并增加了一个mChildList成员变量和相关的方法,用于管理子View。

最后,我们在ViewGroup中定义了一个LayoutParams内部类,并继承自View.LayoutParams。通过这种方式,我们将布局参数从View中分离出来,使得View和ViewGroup之间的关系更加清晰。

总之,桥接模式是一种常用的设计模式,它可以帮助我们将抽象和实现分离开来,从而实现解耦。

 

 

 

以上是关于23种设计模式-桥接模式(安卓应用场景介绍)的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式--桥接模式

23种设计模式的分类和应用场景总结设计模式

23种设计模式的分类和应用场景总结设计模式

23种设计模式总览

设计模式之适配器模式与桥接模式详解和应用

23种设计模式的介绍