设计mode

builder模式
场景:自定义组合控件需要很多配置参数、参数间存在顺序、参数可选。如果只能通过传参构造,那会存在十几个参数,不方便阅读和维护,如果通过set方法设置,又要注意调用顺序、构造算法。使用builder模式,构建一个builder对象,set相应的参数,构建产品,对使用者隐匿复杂的构造过程。
特点:构建了一个多余的实例,增加内存
实例:自己写的viewpager,安卓原生的dialog

简单工厂模式
场景:产品的构造需要频繁变更,每次变更都会影响使用者。如果使用工厂模式,隔离直接构造。
特点:factory隔离了使用者和产品的构造,方便扩展和变更,但是新增产品时,需要改工厂中的代码,增加if-else,违反了开闭原则;

工厂方法模式
场景:为了解决简单工厂中的开闭原则问题,每个新增一个产品就新增一个工厂,就不需要更改原有工厂了;
特点:如果某个产品由5个特性决定,改变1个特性就是一个新的产品,排列组合就有25个产品了,需要创建25个工厂,实际上好多工厂就只差一个特性,就要创建一个新的工厂;

抽象工厂模式
场景:一个产品由多个特性决定,该产品需要频繁变更,或者由很多个变种,如果采用工厂方法,会创建很多工厂。把产品的每个特性抽象出来,对特性1创建多个factory,对特性2创建多个factory。。。最后,由一个产品factory组合这些特性factory,如果产品1和产品2之间只差一个特性,就只需要重写那一个方法
特点:使用者只跟产品factory联系,产品factory只跟特性factory联系,一层层隔离

    // 产品是手机
    public interface Phone {}

    // soc由3个特性决定
    public interface Cpu{}
    public interface Ram{}
    public interface Rom{}

    public class Phone1Factory{
        private Cpu cpu;
        private Ram ram;
        private Rom rom;

        protected void createCpu(){
            // 使用cpuFacory1创建Cpu1
            // 使用cpuFacory2创建Cpu2
        }

        protected void createRam(){
            // 使用ramFactory1创建Ram1
            // 使用ramFactory2创建Ram2
        }

        protected void createRam(){
            // 使用romFactory1创建Rom1
            // 使用romFactory2创建Rom2
        }

        protected Phone createPhone(){
            // 根据上面创建的三个特性,构建soc
        }
    }

装饰者模式
场景:一个产品由多个属性,这些属性是可选的,创建时是未知的,会随着程序的运行动态改变的。跟builder模式、工厂模式的区别:
builder模式:产品创建后无法改变,只有一个产品,主要目的是隐藏、隔离复杂的创建过程;
工厂模式:产品创建后无法改变,有多个相似产品,主要目的是优雅地创建多个相似产品;
装饰者模式:产品创建后可以改变,只有一个产品,主要目的是让产品随着程序运行而改变;

策略模式
特点/优势:多变的业务逻辑,把变化的部分抽象成一个类,不同的子类有不同的实现
例子:对各种指令的处理,客户A希望打开并播放,客户B希望后台播放。android中的setOnClickListener就是典型的策略模式。可以结合工厂模式,生产不同的策略;

状态模式
特点/优势:把某个业务逻辑抽成一个类(状态),这个类定义一个run方法,每个子类对run方法的执行不一样,跟策略模式看上去一样
场景:策略模式是静态的、初始化时就决定了,是调用者决定到底使用哪个策略。如果策略需要做成动态的、而且如何改变还依赖策略本身(比如,调用了策略A的run方法后,有可能需要把策略切换为B),如果还是让调用者决定到底使用哪个策略,调用者代码就很难维护。状态模式就是把策略下沉到具体产品中去,当调用了某个方法、发生了某个事情时,状态切换到B,所有依赖状态的方法都由策略B类实现,调用的也是策略B类的run方法;
例子:调用player的exit方法后,player状态就变为“退出状态”了,某些方法的执行逻辑就会改变了

责任链模式
特点/优势:一系列复杂的、链条比较长的业务逻辑,通过单一职责分配,每个类执行一部分,最后连起来执行一条复杂的业务逻辑
场景:一条指令下来,第一步是解析指令和参数,第二步是区分当前语音焦点、这个指令给谁处理,第三步是交给具体的proxy处理。android中的控件绘制,父控件绘制自己,确定子控件位置,通知子控件,子控件绘制自己

模版方法模式
一个接口可能会有很多个子类,每个子类的主体流程是固定的,但流程中的每一步实现又不一样。。。。好吧,直接说吧,具是View和Activity这种,要按固定顺序要调那几个方法,但是每个方法的实现要放在子类实现

代理模式
一个解耦器,两个不同的管道要对接,中间加个适配器,两个管道都只跟适配器对接

中介模式
5个产品类,每个类的行为、特点都受其它产品类的影响,改动一个产品,其它4个产品可能都要跟着改动。通过中介模式,所有产品的改动都通知中介,中介负责通知各个产品。就是事件总线,典型的如播放列表、本地音源、收藏列表、播放器

你可能感兴趣的:(设计mode)