Android里的设计模式


一:设计模式分类

经典的23种设计模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(合称“Gang of Four”)在他们的书《设计模式:可复用面向对象软件的基础》中定义的。以下是这些设计模式的分类和简要介绍。

1.1创建型模式

  1. 单例模式 (Singleton):确保一个类只有一个实例,并提供一个全局访问点。
  2. 抽象工厂模式 (Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
  3. 工厂方法模式 (Factory Method):定义一个创建对象的接口,但由子类决定实例化哪个类。
  4. 生成器模式 (Builder):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  5. 原型模式 (Prototype):使用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。

1.2结构型模式

  1. 适配器模式 (Adapter):将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
  2. 桥接模式 (Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
  3. 组合模式 (Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
  4. 装饰模式 (Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
  5. 外观模式 (Facade):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。
  6. 享元模式 (Flyweight):运用共享技术有效地支持大量细粒度的对象。
  7. 代理模式 (Proxy):为其他对象提供一种代理以控制对这个对象的访问。

1.3行为型模式

  1. 责任链模式 (Chain of Responsibility):为请求创建一个接收者对象的链,这种模式使得多个对象都有机会处理请求,避免了请求的发送者和接收者之间的耦合。
  2. 命令模式 (Command):将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
  3. 解释器模式 (Interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
  4. 迭代器模式 (Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
  5. 中介者模式 (Mediator):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  6. 备忘录模式 (Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象为先前的状态。
  7. 观察者模式 (Observer):定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
  8. 状态模式 (State):允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
  9. 策略模式 (Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互换,本模式使得算法可独立于使用它的客户而变化。
  10. 模板方法模式 (Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  11. 访问者模式 (Visitor):表示一个作用于某对象结构中的各元素的操作,它使您可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

这些设计模式在Android开发中也有很多应用,可以帮助开发者设计更好的架构和解决常见问题。尽管有些模式在不同环境中有特定的实现方式,但核心思想依然适用。

二:Android中的使用

在 Android 开发中,虽然23种经典设计模式都有可能用到,但一些模式在实际开发中更为常见和实用。以下是Android开发中常用的设计模式及其应用场景:

1. 单例模式 (Singleton)

应用场景

  • 全局唯一的实例,如网络管理器、数据库管理器、SharedPreferences管理器等。

示例

public class NetworkManager {
    private static NetworkManager instance;

    private NetworkManager() {}

    public static synchronized NetworkManager getInstance() {
        if (instance == null) {
            instance = new NetworkManager();
        }
        return instance;
    }
}

 

2. 工厂方法模式 (Factory Method)

应用场景

  • 根据条件动态创建不同的对象,如Fragment的实例化。

示例

public abstract class Fragment {
    public static Fragment newInstance(String type) {
        if (type.equals("home")) {
            return new HomeFragment();
        } else if (type.equals("settings")) {
            return new SettingsFragment();
        } else {
            return null;
        }
    }
}

 

3. 观察者模式 (Observer)

应用场景

  • 事件总线,LiveData,ViewModel和UI组件之间的数据绑定。

示例

public class UserViewModel extends ViewModel {
    private MutableLiveData<User> user = new MutableLiveData<>();

    public LiveData<User> getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user.setValue(user);
    }
}

 

4. 模板方法模式 (Template Method)

应用场景

  • 定义Activity或Fragment的生命周期方法。

示例

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        initialize();
    }

    protected abstract int getLayoutId();
    protected abstract void initialize();
}

5. 适配器模式 (Adapter)

应用场景

  • RecyclerView适配器、ListView适配器。

示例

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String> data;

    public MyAdapter(List<String> data) {
        this.data = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.textView.setText(data.get(position));
    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }
    }
}

6. 代理模式 (Proxy)

应用场景

  • Retrofit的动态代理,用于创建API接口实例。

示例

public interface ApiService {
    @GET("users/{user}")
    Call<User> getUser(@Path("user") String user);
}

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

ApiService service = retrofit.create(ApiService.class);

7. 责任链模式 (Chain of Responsibility)

应用场景

  • 事件分发机制,如触摸事件的传递。

示例

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (onInterceptTouchEvent(ev)) {
        return onTouchEvent(ev);
    }
    return super.dispatchTouchEvent(ev);
}

8. 享元模式 (Flyweight)

应用场景

  • 优化内存使用,如复用View对象。

示例

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.item_view, parent, false);
    }
    // Bind data to the view
    return convertView;
}

9. 装饰模式 (Decorator)

应用场景

  • 动态添加功能,如View的装饰器。

示例

public class BorderDecorator extends View {
    private View view;

    public BorderDecorator(View view) {
        super(view.getContext());
        this.view = view;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // Draw border
        view.draw(canvas);
    }
}

10. 迭代器模式 (Iterator)

应用场景

  • 处理集合类,如遍历数据列表。

示例

List<String> list = new ArrayList<>();
for (String item : list) {
    // Process item
}

这些设计模式在Android开发中常见且实用,它们可以帮助我们开发者创建更结构化、可维护和扩展性强的应用程序。

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值