Android开发中常用的设计模式及应用场景

在Android开发中,设计模式是非常重要的一个方面。它们为开发人员提供了一种可复用、可维护和可扩展的解决方案,许多常见的问题已经有了设计模式的解决方案。在本篇文章中,将会介绍在Android开发中常用的设计模式及其应用场景。

一、单例模式

单例模式是一种经典的设计模式,它确保了一个类在任何情况下都只能有一个实例,并提供了一个全局访问点来访问该实例。

在Android开发中,单例模式通常用于管理应用程序的全局状态,例如:应用程序的配置信息、网络连接对象、数据库连接对象等。

下面是单例模式的示例代码:

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在该示例代码中,该类的构造函数被声明为私有的,防止在类外部创建它的实例。在getInstance()方法中,使用double-check locking方式来确保只有在instance为空的情况下才创建对象,并使用volatile修饰符确保线程安全性。

二、观察者模式

观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象的状态变化。

在Android开发中,观察者模式通常用于实现UI的数据更新,例如当一个数据模型的状态发生变化时,所有观察该模型的界面可以同时更新。

下面是观察者模式的示例代码:

public interface Observer {
    void onUpdate(Observable observable);
}

public interface Observable {
    void addObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

public class DataModel implements Observable {
    private List observers = new ArrayList();

    private int data;

    public int getData() {
        return data;
    }

    public void setData(int data) {
        if (this.data != data) {
            this.data = data;
            notifyObservers();
        }
    }

    @Override
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.onUpdate(this);
        }
    }
}

public class MainActivity implements Observer {

    @Override
    public void onUpdate(Observable observable) {
        if (observable instanceof DataModel) {
            DataModel dataModel = (DataModel) observable;
            // Update UI with new data
        }
    }
}

在该示例代码中,DataModel实现了Observable接口,MainActivity实现了Observer接口。当DataModel中的data属性发生变化时,DataModel会调用notifyObservers()方法通知所有观察者,包括MainActivity。然后MainActivity可以在onUpdate()方法中更新UI来反映数据的变化。

三、策略模式

策略模式是一种行为型模式,它定义了一系列算法,将每个算法都封装起来,并且使它们可以互换。策略模式让算法的变化独立于使用它的客户端。

在Android开发中,策略模式通常用于实现复杂算法或业务逻辑,例如:在表单中实现输入验证或者在计算器应用中实现计算功能。

下面是策略模式的示例代码:

public interface CalculationStrategy {
    int calculate(int num1, int num2);
}

public class AddStrategy implements CalculationStrategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 + num2;
    }
}

public class SubtractStrategy implements CalculationStrategy {
    @Override
    public int calculate(int num1, int num2) {
        return num1 - num2;
    }
}

public class Calculator {
    private CalculationStrategy strategy;

    public Calculator(CalculationStrategy strategy) {
        this.strategy = strategy;
    }

    public int calculate(int num1, int num2) {
        return strategy.calculate(num1, num2);
    }

    public void setStrategy(CalculationStrategy strategy) {
        this.strategy = strategy;
    }
}

// Usage example
Calculator calculator = new Calculator(new AddStrategy());
int result = calculator.calculate(5, 3);
calculator.setStrategy(new SubtractStrategy());
result = calculator.calculate(5, 3);

在该示例代码中,AddStrategy和SubtractStrategy类都实现了CalculationStrategy接口,分别实现了加法和减法的算法。Calculator类使用构造函数来接收一个CalculationStrategy实例,并在calculate()方法中调用该实例的calculate()方法来实现具体的算法。然后,该类提供了一个setStrategy()方法,可以在运行时动态地更改算法。

四、建造者模式

建造者模式是一种创建型模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

在Android开发中,建造者模式通常用于创建复杂的对象,例如:AlertDialog等。

下面是建造者模式的示例代码:

public class AlertDialog {
    private String title;
    private String message;
    private boolean cancelable;
    private List buttons;

    private AlertDialog(String title, String message, boolean cancelable, List buttons) {
        this.title = title;
        this.message = message;
        this.cancelable = cancelable;
        this.buttons = buttons;
    }

    public String getTitle() {
        return title;
    }

    public String getMessage() {
        return message;
    }

    public boolean isCancelable() {
        return cancelable;
    }

    public List getButtons() {
        return buttons;
    }

    public static class Builder {
        private String title;
        private String message;
        private boolean cancelable;
        private List buttons = new ArrayList();

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

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

        public Builder setCancelable(boolean cancelable) {
            this.cancelable = cancelable;
            return this;
        }

        public Builder addButton(AlertDialogButton button) {
            buttons.add(button);
            return this;
        }

        public AlertDialog build() {
            return new AlertDialog(title, message, cancelable, buttons);
        }
    }
}

public class AlertDialogButton {
    private String text;
    private View.OnClickListener listener;

    public AlertDialogButton(String text, View.OnClickListener listener) {
        this.text = text;
        this.listener = listener;
    }

    public String getText() {
        return text;
    }

    public View.OnClickListener getListener() {
        return listener;
    }
}

// Usage example
AlertDialog alertDialog = new AlertDialog.Builder(context)
    .setTitle("Title")
    .setMessage("Message")
    .setCancelable(false)
    .addButton(new AlertDialogButton("OK", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Handle button click
        }
    }))
    .addButton(new AlertDialogButton("Cancel", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Handle button click
        }
    }))
    .build();
alertDialog.show();

在该示例代码中,AlertDialog类声明了一个Builder类,该类使用流畅接口风格的API来创建AlertDialog对象,并提供了setXXX()方法来设置各种属性。当所有属性都设置完成后,调用build()方法来创建AlertDialog对象,这个过程可以看作是具体构建者的实现。Builder类同时也声明了AlertDialogButton类来实现对按钮的封装。然后,通过调用AlertDialog.Builder类的静态方法,可以使用Builder类创建AlertDialog类的实例。

五、适配器模式

适配器模式是一种结构型模式,它允许不兼容接口之间进行合作。

在Android开发中,适配器模式通常用于显示列表数据,例如:ListView或RecyclerView中的数据适配器。

下面是适配器模式的示例代码:

public interface Item {
    int getItemType();
}

public interface ItemViewBinder {
    void onBindItemView(ItemViewHolder viewHolder, T item);
}

public class ItemViewHolder extends RecyclerView.ViewHolder {
    private SparseArray views = new SparseArray();

    public ItemViewHolder(View itemView) {
        super(itemView);
    }

    public  T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = itemView.findViewById(viewId);
            views.put(viewId, view);
        }
        return (T) view;
    }
}

public class MultipleTypeAdapter extends RecyclerView.Adapter {
    private List items = new ArrayList();
    private SparseArray<ItemViewBinder> viewBinders = new SparseArray();

    public  void register(Class clazz, ItemViewBinder binder) {
        viewBinders.put(clazz.hashCode(), binder);
    }

    public void setItems(List items) {
        this.items = items;
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return items.get(position).getItemType();
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ItemViewBinder binder = viewBinders.get(viewType);
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(binder.getLayoutRes(), parent, false);
        return new ItemViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        Item item = items.get(position);
        ItemViewBinder binder = viewBinders.get(item.getItemType());
        binder.onBindItemView(holder, item);
    }

    @Override
    public int getItemCount() {
        return items.size();
    }
}

public class TextItem implements Item {
    private String text;

    public TextItem(String text) {
        this.text = text;
    }

    @Override
    public int getItemType() {
        return TextItem.class.hashCode();
    }

    public String getText() {
        return text;
    }
}

public class TextViewBinder implements ItemViewBinder {
    @Override
    public void onBindItemView(ItemViewHolder viewHolder, TextItem item) {
        TextView textView = viewHolder.getView(R.id.text_view);
        textView.setText(item.getText());
    }

    @LayoutRes
    @Override
    public int getLayoutRes() {
        return R.layout.item_text;
    }
}

// Usage example
MultipleTypeAdapter adapter = new MultipleTypeAdapter();
adapter.register(TextItem.class, new TextViewBinder());
List items = new ArrayList();
items.add(new TextItem("Hello, world!"));
items.add(new TextItem("Hello, Android!"));
adapter.setItems(items);
recyclerView.setAdapter(adapter);

在该示例代码中,Item接口定义列表项,ItemViewBinder接口定义视图绑定器,负责将Item绑定到RecyclerView.ViewHolder中,而ItemViewHolder则表示ViewHolder对象。MultipleTypeAdapter使用SparseArray保存视图绑定器,这样只需要使用Item的类名的hashCode作为key,就可以方便地获取到它对应的视图绑定器。

没有注册的Item类型将会引发运行时异常,因此最好提供默认的视图绑定器。然而这个例子没有提供默认的视图绑定器,因为它只是用来演示适配器的工作原理。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/184816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 05:02
下一篇 2024-11-26 05:02

相关推荐

  • Python 常用数据库有哪些?

    在Python编程中,数据库是不可或缺的一部分。随着互联网应用的不断扩大,处理海量数据已成为一种趋势。Python有许多成熟的数据库管理系统,接下来我们将从多个方面介绍Python…

    编程 2025-04-29
  • Unity3D 创建没有 Terrain Tile 的场景

    这篇文章将会介绍如何在 Unity3D 中创建一个没有 Terrain Tile 的场景,同时也让读者了解如何通过编程实现这个功能。 一、基础概念 在 Unity3D 中,Terr…

    编程 2025-04-29
  • Python强制转型的实现方法和应用场景

    本文主要介绍Python强制转型的实现方法和应用场景。Python强制转型,也叫类型转换,是指将一种数据类型转换为另一种数据类型。在Python中,强制转型主要通过类型构造函数、转…

    编程 2025-04-29
  • Python序列的常用操作

    Python序列是程序中的重要工具,在数据分析、机器学习、图像处理等很多领域都有广泛的应用。Python序列分为三种:列表(list)、元组(tuple)和字符串(string)。…

    编程 2025-04-28
  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Android ViewPager和ScrollView滑动冲突问题

    Android开发中,ViewPager和ScrollView是两个常用的控件。但是当它们同时使用时,可能会发生滑动冲突的问题。本文将从多个方面介绍解决Android ViewPa…

    编程 2025-04-28
  • Android如何点击其他区域收起软键盘

    在Android应用中,当输入框获取焦点弹出软键盘后,我们希望能够点击其他区域使软键盘消失,以提升用户体验。本篇文章将说明如何实现这一功能。 一、获取焦点并显示软键盘 在Andro…

    编程 2025-04-28
  • 上传多媒体文件的常用方法——uploadmediabyurl

    uploadmediabyurl是一个非常常用的方法,它允许我们将本地的多媒体文件上传到微信服务器上。 一、uploadmediabyurl的基本使用方法 要使用uploadmed…

    编程 2025-04-27
  • Python数据看板开发:常用的包及其使用

    随着数据分析和可视化的需求日渐增长,数据看板作为一种高效展示复杂数据信息的工具应运而生。Python语言作为一种面向数据分析和科学计算的编程语言,在数据看板开发中有着广泛的应用。本…

    编程 2025-04-27
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27

发表回复

登录后才能评论