android 设计模式6大原则之 开闭原则

本文深入探讨了Android开发中的开闭原则,通过面向接口编程和MVP架构进行最佳实践,展示了如何在Base类中应用此原则,以及在ViewPager和Fragment中实现数据刷新的高效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 android 开闭原则 用日常程序语音来说就是面向接口编程吧。就是mvp 架构 是这个原则的最佳实践。

在android 源码与设计模式这书种,明显讲了有点乱。看到了最后才看出来就是面向接口编程的意思。

这个原则在实际开发中 使用的不是很多,整体架构 才会去使用吧。一般与单一原则一起使用。

简单的来说, 开闭原则在实际开发中 比较常见的使用场景 是 ,Base类中,比如 有一个BaseActivty 有

3个Activity 继承使用,如果需要关闭 所有Activity 实现退出程序。那么在base中 实现 activty管理逻辑,

最后关闭所有Activity就可以了。

 

再给大家举例,在

ViewPager + Fragmengt 实现刷新某一个fragemnt数据操作。

有一个操作就是 在 fragment中 getActivty,强制转换为 父类activity。然后调用父类activty的方式,在这个

方法里面写入逻辑, 获得需要刷新的 fragment ,传值或者 重新创建一个 。然后刷新viewpage.达到刷新

这个fragmeng的操作。但是10个fragment就要写10套逻辑,虽然可以抽取,但是刷新的数据什么的都不一样。

所有有一个方法,在适配器中写一个 刷新,方法。所有frament继承刷新方法,在里面实现刷新操作。调用

这个适配器,放入下面就可以实现刷新。

public abstract class BaseFragmentPagerAdapter extends FragmentPagerAdapter {

    private FragmentManager mFragmentManager;
    private List<String> tagList = new ArrayList<String>();

    public BaseFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
        this.mFragmentManager = fm;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        tagList.add(makeFragmentName(container.getId(), getItemId(position)));
        return super.instantiateItem(container, position);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object){
        super.destroyItem(container, position, object);
        tagList.remove(makeFragmentName(container.getId(), getItemId(position)));
    }

    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }

    public void update(int position){
        Fragment fragment = (Fragment)mFragmentManager.findFragmentByTag(tagList.get(position));
        if(fragment == null){
            return;
        }
        if(fragment instanceof UpdateAble){//这里唯一的要求是Fragment要实现UpdateAble接口
            ((UpdateAble)fragment).update();
        }
    }

    public interface UpdateAble {
        public void update();
    }
}

再给大家讲一个 很有用但是不常见的例子。就是封装网络 请求 时候 的一个操作。

就是 服务器返回一个 json,一般对应一个 object,或者arraylist。那么我们 是不是 可以把 这个类型传进入,

然后服务器返回的时候,统一解析在异步线程中解析对应的bean.返回回来。下面就是代码;

static Type getSuperclassTypeParameter(Class<?> subclass) {
     Type superclass = subclass.getGenericSuperclass();
     if (superclass instanceof Class) {
          throw new RuntimeException("Missing type parameter.");
     }
     ParameterizedType parameterized = (ParameterizedType) superclass;
     return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}

//这一步是把 对应的object转换为 Gson解析的type.

// 下面这部就是 使用 gson和type 转为对应的object ,在使用的时候强制转换一道就可以了

Object o = new Gson().fromJson(response.getData(), handler.mType);

 

总结: 开闭原则 我个人认为比较难,架构师必备。需要对整个项目 逻辑十分清晰,先要

把某块业务逻辑先拆分为 单一原则,然后对这个块逻辑,实现一个base。或者接口。

使用场景:

1.代码重构时候,发现功能基本一样的时候。把 代码合并。

2.该业务逻辑 可以拆分为一块 ,并且代码实现逻辑不一致,但是功能一致。

例如,加载图片这个功能, 业务逻辑为 加载图片,单独一块。加载图片方式很多,框架也多。但是

功能都是把 imagview,和url 仍进去,最后 imageview绑定 图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值