设计模式

设计模式分类

    设计模式可分为三大类,共23种经典模式:

类型 核心目标 典型模式
创建型 对象创建方式的解耦 单例、工厂、建造者、原型、抽象工厂
结构型 对象组合与结构优化 适配器、代理、装饰者、组合、外观、桥接
行为型 对象间交互与职责分配 观察者、策略、模板方法、责任链、命令、状态

1. 创建型模式

1.1 单例模式(Singleton)

核心思想

    确保一个类仅有一个实例,并提供全局访问点。

实现方式

    双重检查锁定(DCL):

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;
    }
}

    静态内部类(推荐,线程安全且延迟加载):

public class Singleton {
    private Singleton() {}
    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

Android应用

    LayoutInflater:通过Context.getSystemService()获取单例。

    注意事项:避免内存泄漏(如单例持有Activity引用)。

1.2 工厂模式(Factory)

核心思想

    将对象创建逻辑封装到工厂类中,客户端无需关心具体实现。

实现方式

    简单工厂:

public class BitmapFactory {
    public static Bitmap createBitmap(String type) {
        if ("file".equals(type)) {
            return new FileBitmap();
        } else if ("network".equals(type)) {
            return new NetworkBitmap();
        }
        return null;
    }
}

    抽象工厂(定义产品族):

public interface ThemeFactory {
    Button createButton();
    TextView createTextView();
}
public class MaterialThemeFactory implements ThemeFactory {
    @Override public Button createButton() { return new MaterialButton(); }
    @Override public TextView createTextView() { return new MaterialTextView(); }
}

Android应用

    BitmapFactory.decodeResource():根据资源类型创建Bitmap。

    NotificationCompat.Builder:构建不同样式的通知。

1.3 建造者模式(Builder)

核心思想

    分离复杂对象的构建与表示,支持逐步构建和配置。

实现方式

public class AlertDialogBuilder {
    private String title;
    private String message;
    public AlertDialogBuilder setTitle(String title) {
        this.title = title;
        return this;
    }
    public AlertDialogBuilder setMessage(String message) {
        this.message = message;
        return this;
    }
    public AlertDialog build() {
        return new AlertDialog(title, message);
    }
}
// 使用
AlertDialog dialog = new AlertDialogBuilder()
    .setTitle("提示")
    .setMessage("确认删除?")
    .build();

Android应用

    AlertDialog.Builder、Retrofit.Builder:通过链式调用配置参数。

    Glide.with(context).load(url).into(imageView):Glide的API设计也隐含建造者模式思想。

2. 结构型模式

2.1 适配器模式(Adapter)

核心思想

    将不兼容的接口转换为客户端期望的接口。

实现方式

    类适配器(继承方式):

public class LegacyAdapter extends LegacyLibrary implements NewInterface {
    @Override public void newMethod() {
        oldMethod(); // 调用父类方法
    }
}

对象适配器(组合方式,更灵活):

public class Adapter implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override public void request() {
        adaptee.specificRequest();
    }
}

Android应用

    RecyclerView.Adapter:将数据集适配为View展示。

    ArrayAdapter:将数组或List数据适配到ListView。

2.2 代理模式(Proxy)

核心思想

    为其他对象提供一种代理以控制对这个对象的访问。

实现方式

    静态代理:

public interface ImageLoader {
    void loadImage(String url);
}
public class RealImageLoader implements ImageLoader {
    @Override public void loadImage(String url) { /* 实际加载逻辑 */ }
}
public class ProxyImageLoader implements ImageLoader {
    private RealImageLoader realLoader;
    @Override public void loadImage(String url) {
        if (realLoader == null) realLoader = new RealImageLoader();
        realLoader.loadImage(url); // 代理实际对象
    }
}

    动态代理(基于接口,运行时生成代理类):

public static Object createProxy(Object target) {
    return Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        (proxy, method, args) -> {
            // 前置逻辑(如权限校验)
            Object result = method.invoke(target, args);
            // 后置逻辑(如缓存结果)
            return result;
        });
}

Android应用

    Binder机制:客户端通过Proxy对象跨进程调用服务端方法。

    Glide的RequestManagerRetriever:代理管理图片请求生命周期。

3. 行为型模式

3.1 观察者模式(Observer)

核心思想

    定义对象间的一对多依赖关系,当一个对象状态改变时,自动通知依赖它的对象。

实现方式

public interface Observer {
    void update(String message);
}
public class ConcreteObserver implements Observer {
    @Override public void update(String message) {
        System.out.println("收到消息:" + message);
    }
}
public class Subject {
    private List<Observer> observers = new ArrayList<>();
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

Android应用

    LiveData:数据变化时通知UI组件更新。

    RxJava的Observable:通过订阅机制实现观察者模式。

    BroadcastReceiver:监听系统广播事件。

3.2 策略模式(Strategy)

核心思想

    定义一系列算法,将每个算法封装起来,并使它们可以互相替换。

实现方式

public interface SortingStrategy {
    void sort(int[] data);
}
public class QuickSort implements SortingStrategy {
    @Override public void sort(int[] data) { /* 快速排序实现 */ }
}
public class MergeSort implements SortingStrategy {
    @Override public void sort(int[] data) { /* 归并排序实现 */ }
}
public class Sorter {
    private SortingStrategy strategy;
    public void setStrategy(SortingStrategy strategy) {
        this.strategy = strategy;
    }
    public void executeSort(int[] data) {
        strategy.sort(data);
    }
}

Android应用

    动画插值器(Interpolator):如LinearInterpolator、AccelerateDecelerateInterpolator。

    图片加载策略:Glide根据网络状态选择加载原图或缩略图。

4. Android源码中的设计模式

4.1 责任链模式(View事件分发)

实现逻辑:

public boolean dispatchTouchEvent(MotionEvent ev) {
    if (onInterceptTouchEvent(ev)) { // ViewGroup决定是否拦截
        return onTouchEvent(ev);      // 自身处理
    } else {
        return child.dispatchTouchEvent(ev); // 传递给子View
    }
}

应用场景:

    事件从Activity → ViewGroup → View逐层传递。

4.2 装饰者模式(ContextWrapper)

类结构:

    ContextWrapper(装饰者)包装ContextImpl(被装饰者),通过attachBaseContext()注入具体实现。

应用场景:

    Activity和Service通过继承ContextThemeWrapper扩展功能。

4.3 模板方法模式(AsyncTask)

核心方法:

protected abstract Result doInBackground(Params... params); // 子类实现
protected void onPreExecute() {}    // 模板方法
protected void onPostExecute(Result result) {} // 模板方法

流程固定:

    onPreExecute() → doInBackground() → onPostExecute()

5. 设计模式实践建议

    避免过度设计:优先用简单代码解决问题,模式引入需评估必要性。

    结合语言特性:Kotlin的object关键字可简化单例实现。

    模式混合使用:如RecyclerView = 适配器 + 观察者 + 组合模式。

    关注Android Jetpack:如ViewModel(状态管理)、WorkManager(任务调度)隐含模式思想

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容