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 gDefault = new Singleton() {
        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 中对, 的解析

命令模式

事件传递中, 每次的按键事件都会被封装成 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种设计模式

你可能感兴趣的:(Day16 - 6大原则&23种设计模式)