返回

设计模式的魅力:行为型模式的精妙之处

Android

行为型模式:Android 源码中的协作与职责分离艺术

行为型模式的本质

行为型模式着重于对象之间的交互和职责分配,指导我们设计灵活且可重用的代码。在 Android 源码中,它们在事件处理、算法管理和行为参数化等方面得到了广泛应用。

观察者模式:订阅发布机制

观察者模式是一个发布-订阅机制,它允许对象(订阅者)订阅另一个对象(发布者)的事件通知。当发布者的状态发生变化时,它会通知所有已订阅的观察者。Android 源码中,观察者模式用于系统事件处理和广播通信,如 ContentProvider 和 BroadcastReceiver。

代码示例:

// 发布者类
class Publisher {
    private List<Observer> observers = new ArrayList<>();

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

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

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

// 订阅者类
class Observer {
    public void update() {
        // 更新逻辑
    }
}

策略模式:算法与决策的分离

策略模式将算法或决策与使用它们的类分离,允许在运行时动态切换算法,从而提供高度可定制的解决方案。Android 源码中,策略模式用于图像加载(ImageLoader)和线程调度(ThreadPolicy)。

代码示例:

// 策略接口
interface SortStrategy {
    int[] sort(int[] arr);
}

// 具体策略类
class BubbleSortStrategy implements SortStrategy {
    @Override
    public int[] sort(int[] arr) {
        // 冒泡排序算法
        return arr;
    }
}

class QuickSortStrategy implements SortStrategy {
    @Override
    public int[] sort(int[] arr) {
        // 快速排序算法
        return arr;
    }
}

// 使用策略的类
class SortManager {
    private SortStrategy strategy;

    public SortManager(SortStrategy strategy) {
        this.strategy = strategy;
    }

    public int[] sort(int[] arr) {
        return strategy.sort(arr);
    }
}

命令模式:行为封装

命令模式将行为封装为独立的对象,从而实现行为的解耦和重用。它支持通过命令对象来调用和管理操作,实现命令的队列、撤销和重做等功能。Android 源码中,命令模式用于菜单和按钮事件处理。

代码示例:

// 命令接口
interface Command {
    void execute();
}

// 具体命令类
class OpenFileCommand implements Command {
    @Override
    public void execute() {
        // 打开文件逻辑
    }
}

class SaveFileCommand implements Command {
    @Override
    public void execute() {
        // 保存文件逻辑
    }
}

// 命令调用者
class CommandInvoker {
    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command) {
        commands.add(command);
    }

    public void executeCommands() {
        for (Command command : commands) {
            command.execute();
        }
    }
}

解释器模式:复杂表达式解析

解释器模式将一组表达式或规则解释为一个可执行的程序,它允许以一种可扩展和可重用的方式解析和执行复杂表达式。Android 源码中,解释器模式用于解析 XML 布局文件(LayoutInflator)和动画定义(AnimatorInflater)。

代码示例:

// 表达式接口
interface Expression {
    int interpret(Context context);
}

// 具体表达式类
class NumberExpression implements Expression {
    private int number;

    public NumberExpression(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Context context) {
        return number;
    }
}

class AddExpression implements Expression {
    private Expression left;
    private Expression right;

    public AddExpression(Expression left, Expression right) {
        this.left = left;
        this.right = right;
    }

    @Override
    public int interpret(Context context) {
        return left.interpret(context) + right.interpret(context);
    }
}

// 解释器
class Interpreter {
    public int interpret(String expression) {
        Expression expr = buildExpressionTree(expression);
        return expr.interpret(null);
    }

    private Expression buildExpressionTree(String expression) {
        // 根据语法规则构建表达式树
        return null;
    }
}

模板方法模式:骨架算法定义

模板方法模式定义了一个算法的骨架,而算法的具体步骤则被留给子类去实现。它提供了算法的一致性,同时允许子类自定义某些步骤。Android 源码中,模板方法模式用于 View 的测量和布局(View.onMeasure() 和 View.onLayout())。

代码示例:

// 模板方法类
abstract class AbstractClass {
    public final void templateMethod() {
        step1();
        step2();
        hook();
        step3();
    }

    protected abstract void step1();

    protected abstract void step2();

    protected void hook() {}

    protected abstract void step3();
}

// 具体子类
class ConcreteClass1 extends AbstractClass {
    @Override
    protected void step1() {
        // 子类实现的步骤1逻辑
    }

    @Override
    protected void step2() {
        // 子类实现的步骤2逻辑
    }

    @Override
    protected void step3() {
        // 子类实现的步骤3逻辑
    }
}

class ConcreteClass2 extends AbstractClass {
    @Override
    protected void step1() {
        // 子类实现的步骤1逻辑
    }

    @Override
    protected void step2() {
        // 子类实现的步骤2逻辑
    }

    @Override
    protected void hook() {
        // 子类重写了hook方法
    }

    @Override
    protected void step3() {
        // 子类实现的步骤3逻辑
    }
}

责任链模式:分层请求处理

责任链模式将一系列处理程序链接成一个链,当一个请求出现时,它会从链的开始传递到结束,每个处理程序都有机会处理该请求。它提供了灵活且可扩展的请求处理机制。Android 源码中,责任链模式用于文件和权限请求处理(FileProvider 和 PermissionChecker)。

代码示例:

// 处理程序接口
interface Handler {
    boolean handle(Request request);
}

// 具体处理程序类
class Handler1 implements Handler {
    @Override
    public boolean handle(Request request) {
        // 处理请求1的逻辑
        return true;
    }
}

class Handler2 implements Handler {
    @Override
    public boolean handle(Request request) {
        // 处理请求2的逻辑
        return false;
    }
}

// 责任链
class ChainOfResponsibility {
    private List<Handler> handlers = new ArrayList<>();

    public void addHandler(Handler handler) {
        handlers.add(handler);
    }

    public boolean handle(Request request) {
        for (Handler handler : handlers) {
            if (handler.handle(request)) {
                return true;
            }
        }
        return false;
    }
}

状态模式:状态封装

状态模式将对象的状态和行为封装成独立的类,从而实现状态的解耦和变化的管理。它允许对象在不同的状态之间动态切换,并相应地改变其行为。Android 源码中,状态模式用于 Activity 和 View 的状态管理(Activity.onSaveInstanceState() 和 View.onRestoreInstanceState())。

代码示例:

// 状态接口
interface State {
    void handle();
}

// 具体状态类
class State1 implements State {
    @Override
    public void handle() {
        // 状态1的行为逻辑
    }
}

class State2 implements State {
    @Override
    public void handle() {
        // 状态2的行为逻辑
    }
}

// 上下文类
class Context {
    private State state;

    public void setState(State state) {
        this.state = state;
    }

    public void handle() {
        state.handle();
    }
}

访问者模式:算法与数据结构分离

访问者模式将算法和它所操作的数据结构分离。它允许在不修改数据结构的同时添加新的操作或算法。Android 源码中,访问者模式用于遍历和处理 XML 布局文件(DomTraversal)和视图层次结构(ViewGroup.accept())。

代码示例: