Day16 - 6大原则&23种设计模式

面向对象的六大原则

  1. 单一职责原则
  2. 开闭原则, 对于扩展开放, 对于修改封闭
  3. 里氏替换原则, 所有引用基类的地方必须能透明地使用其子类对象(抽象类)
  4. 依赖倒置原则, 解耦(高层次的模块不依赖于低层次的模块实现)
  5. 接口隔离原则, 拆分接口
  6. 迪米特原则, 一个对象对其他对象应该有最少的了解

设计模式

  1. 代理模式
  2. 单例模式
  3. Builder模式
  4. 原型模式
  5. 工厂模式
  6. 抽象工厂模式
  7. 策略模式
  8. 状态模式
  9. 责任链模式
  10. 解释器模式
  11. 命令模式
  12. 观察者模式
  13. 备忘录模式
  14. 迭代器模式
  15. 模板方法模式
  16. 访问者模式
  17. 中介者模式
  18. 组合模式
  19. 适配器模式
  20. 装饰模式
  21. 享元模式
  22. 外观模式
  23. 桥接模式
  24. MVC, MVP, MPPM

代理模式

代理模式就是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。就是一个人或者一个机构代替另一个人或者另一个机构去采取一些行动,以控制对这个对象的访问。
所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代理与被代理的目标类交互,而代理一般在交互的过程中(交互前后),进行某些特别的处理。
代理模式分为8种, ActivityManagerNative 用到的是 Remote 代理, 外界通过ActivityManagerNative.getDefault();方法创建 IActivityManager 的实现, 而 ActivityManagerNative 和 ActivityManagerProxy 都在 ActivityManagerNative.java文件中

public abstract class ActivityManagerNative extends Binder implements IActivityManager{
  static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }

        return new ActivityManagerProxy(obj);
    }

    static public IActivityManager getDefault() {
        return gDefault.get();
    }

    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };
}

class ActivityManagerProxy implements IActivityManager{
  public ActivityManagerProxy(IBinder remote)
    {
        mRemote = remote;
    }

    public IBinder asBinder()
    {
        return mRemote;
    }
}

单例模式

Builder模式

类似AlertDialog.builder

public class MyBuilder{
    private int id;
    private String num;
    public MyData build(){
        MyData d=new MyData();
        d.setId(id);
        d.setNum(num);
        return t;
    }
    public MyBuilder setId(int id){
        this.id=id;
        return this;
    }
    public MyBuilder setNum(String num){
        this.num=num;
        return this;
    }

}

public class Test{
    public static void  main(String[] args){
        MyData d=new MyBuilder().setId(10).setNum("hc").build();
    }

}

工厂模式

根据传入的参数决定产生的是什么对象

public Object getSystemService(String name) {
    if (getBaseContext() == null) {
        throw new IllegalStateException("System services not available to Activities before onCreate()");
    }
    //........
    if (WINDOW_SERVICE.equals(name)) {
         return mWindowManager;
    } else if (SEARCH_SERVICE.equals(name)) {
        ensureSearchManager();
        return mSearchManager;
    }
    //.......
    return super.getSystemService(name);
  }

抽象工厂模式

public class BaseService extends Service{
    @Nullable
    @Override
    public IBinder onBind(Intent intent){
        return new Binder();
    }

}

策略模式

属性动画的插值器, 可以从一个方法中实现很多种

状态模式

wifi 行为由状态决定, 不同状态启动不同方法

责任链模式

点击事件的传递

解释器模式

AndroidManifest.xml 中对<Activity>, <Service>的解析

命令模式

事件传递中, 每次的按键事件都会被封装成 NotifyKeyArgs 对象, 通过 InputDispatcher 封装具体的事件操作.

观察者模式

ListView 的 Adapter 的notifyDataSetChange()

备忘录模式

Activity 的 onSaveInstanceState 和 onRestoreInstanceState

迭代器模式

Iterator 类, SQLiteDataBase 的 query 方法, 返回的 cursor 对象, 通过如下方式去遍历

cursor.moveToFirst();
do{
//cursor.getXXX(int);
}while(cursor.moveToNext);

模板方法模式

Activity 的 onCreate, onStart方法

访问者模式

编译器的注解, APT(Annotation Processing Tools), ButterKnife, Dagger, Retrofit

中介者模式

Binder
系统启动时, 各种系统服务会向 ServiceManager 提交注册, 即 ServiceManager 持有各种系统服务的引用, 当我们需要获取系统的 Service 时, 比如 ActivityManager, WindowManager等(它们都是 Binder), 首先是向 ServiceManager 查询指定标志符对应的 Binder, 再由 ServiceManager 返回 Binder 的引用, 并且客户端和服务端之间的通信是通过 Binder 驱动来实现, 这里的ServieManager 和 Binder 驱动就是中介者.

组合模式

View, ViewGroup

适配器模式

把一个类的接口变成客户端所期待的另一个类的接口, 从而使得原本接口不匹配而无法在一起工作的两个类能够在一起工作
ListView 的 adapter:

  • ListView 只关心 它的每个ItemView, 不关心ItemView具体显示什么.
  • 数据源和 ListView 之间也没有什么关系
  • 通过适配器提供给ListView getView()方法, 每次 ListView 只需要提供位置信息给getView(), 然后 getView 根据位置信息向数据源获取对应的数据, 根据数据返回不同的View.

装饰模式

通过内部类, 内部类的实例既有外部类的实例, 还有自己在内部类添加的方法
ContextWrapper 内部有个 Context的引用, 并且 ContextWrapper 对 Context的每个方法都有实现, 在实现中调用的就是mContext的方法

享元模式

池来重用对象, 避免频繁创建对象, 常量池, 线程池.
Message.obtain()就是从消息池中取出可重复使用的信息, 避免产生大量 Message 对象.

外观模式

一个子系统的外部与内部的通信必须通过一个统一的对象进行.
Context, Android的很多操作, 比如 StartActvity, BindService(), sendBroadCast都通过 Context 实现.

桥接模式

将抽象和实现部分分离, 使它们能独立的进行变化.
比如 View ,可以将其写成ButtonView, TextView 进行描述上的变化, 也可以将其作为 DisPlay, Canvas 的操作对象.

MVC, MVP MVVM

MVC

Model: 下载下来的数据
View: View
Controller: Activity

MVP

Model:
View:
Presenter:

MVVM

Model: 数据
View: View
ViewModel: ViewHolder
RecyclerView 中的 ViewHolder 就是, 通过ViewHodler, 不用每次都写 findViewById.

参考 简书 | 从Android代码中来记忆23种设计模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容