Android设计模式简单理解(上)
1 迭代器模式
解决问题:主要是多个类的话,搜寻出相应的个股并逐个打印出来,这个在调⽤类的过程中,会产⽣较多的for循环或者while循环。如果多个调⽤类的话,在调⽤类中写不好并且重复多遍。
设计思路:迭代模式,先定义号迭代器接⼝,⾥⾯有循环迭代的接⼝,然后定义⼀个迭代器类继承迭代器接⼝,实现循环迭代的接⼝。然后在容器接⼝中调⽤迭代器的类,以实现循环迭代的效果,再⽣成⼀个容器类来继承容器接⼝来写定义好的⽅法。最后调⽤类直接调⽤容器类提供的接⼝,即可实现循环遍历查询的⽬的
常⽤场景:数据库的cursor游标
github地址:
2 模版⽅法模式
解决问题:有很多开发中固定的关键步骤,并确定了这些步骤的执⾏顺序,但是具体步骤会随着环境的变化⽽变化。譬如电脑开机的步骤:开启电源->硬件检查->加载系统->登录->关闭,程序员的计算机多了⼀部输⼊密码登录,军⽅的计算机多了指纹登录外,不仅要硬件检查,还要加多⼀部做防⽕墙检查
设计思路:模版⽅式模式,先定义⼀个抽象类,先定义基本的⽅法,然后最后final⼀个⽅法实现按顺序⾛必须要⾛的⽅法;然后根据需求新的类,继承抽象类,重写抽象类中需要增加的⽅法,如果沿⽤抽象类的⽅法,保留 super.fun(),;既⾛⽗类的⽅法,也⾛⾃⼰的⽅法,在
super.fun() 写新的实现代码;不⾛⽗类的⽅法,直接抹掉 super.fun()
常⽤场景:AsyncTask
3 访问者模式
解决问题:1、对象结构⽐较稳定,但经常需要在此对象上定义新的操作 2、需要对⼀个对象结构中的对象进⾏很多不同的并且不相关的操作,⽽需要避免污染这些对象的类,也不希望在增加新操作时修改这些类
设计思路:访问者模式⽐较复杂,⾸先定义为⾓⾊的分配,以员⼯和⽼板为例,cto、ceo = visitor,拥有查看员⼯信息的权限,经理、⼯程师 = staff;⾸先staff被查看者都定义⼀个可以查看的权限,visitor只有权限才能查看,然后定义⼦类需要的值,构建经理和⼯程师两个⼦类,这两个⼦类利⽤staff的值,写各⾃独有的⽅法;然后定义接⼝类visitor的⽅法,写两个相同的⽅法visit(),但是传的是两个不同的staff类的参数,然后构建两个继承visitor的ceo和cto类,它们的⽅法分别是调⽤查看经理和⼯程师的信息⽅法visit() (通过参数的不同来区分)
常⽤场景:
4 中介者模式
解决问题:当对象之间的交互操作很多且每个对象的⾏为都彼此依赖时,为防⽌在修改⼀个对象的⾏为时,同时涉及修改很多其他对象的⾏为,可⽤中介模式来解决紧耦合的问题。该模式由多对多变成⼀对多的关系,将系统从⽹状结构变成以调停者为中⼼的星形结构,达到降低系统的复杂性,提⾼可扩展性的作⽤
设计思路:将对象的⾏为和协作抽象化,把对象在⼩尺度的⾏为上与其他对象的相互作⽤分开处理,
常⽤场景:keyguard锁屏
github地址:
5 代理模式(委托模式)
解决问题:当⽆法或不想直接访问某个对象或访问某个对象存在困难的时候可以通过⼀个代理对象来间接访问,为了保证客户端使⽤的透明性,委
托对象与代理对象需要实现相同的接⼝
设计思路:结构性模式。以讨薪⾛法律流程为例,1、(静态代理)⾸先先定义⼀个接⼝类,定义好上述固定的步骤: 申诉->举证->辩护->完成 四个⽅法;定义具体诉讼类,继承诉讼接⼝类,重写接⼝类的⽅法;定义具体代理类,持有⼀个具体被代理者的引⽤,实例化代理类时要把诉讼类传进来成为引⽤,代理类的四个规定步骤,⾛的全是诉讼类的相同⽅法(也就是代理类只是作为⼀个代理转达消息,并没有实质⾃⼰要做的事);调⽤类⽤接⼝类构造⼀个具体的诉讼类,再创建⼀个代理类,将构建好的诉讼类传⼊代理类中,代理按照步骤将⽅法逐个调⽤。2、(动态代理)通过反射的机制动态地⽣成代理者的对象,也就是在code阶段压根不知道代理谁,在有在执⾏阶段才知道(java提供了动态代理接⼝InvocationHandler,实现该接⼝需要重写其调⽤的invoke()⽅法);先声明⼀个object的引⽤,该引⽤将指向被代理类,⽽我们调⽤被代理类的具体⽅法则在invoke⽅法中执⾏,实例化动态代理后,继续按步骤调⽤固定的⽅法即可
常⽤场景:Binder跨进程通信机制与AIDL
6 组合模式
解决问题:将⼀组相似的类看作⼀个对象来处理,并根据⼀个树状结构来组合对象,然后提供⼀个统⼀的⽅法去访问相应的对象,以此忽略掉对象与对象集合之间的差异。不同的对象根据抽象的基类的抽象⽅法,定义该对象的类能否实现该功能,譬如⽂件夹和⽂件的功能区分,⽂件夹下能加⽂件,⽽⽂件下不能加⽂件
设计思路:以⽂件来举例,先定义抽象的基类Dir,然后定义抽象的⽅法;定义⽂件夹类Folder继承Dir,实现Dir类的添加⽂件、移除⽂件等⽅法;定义⽂件类File继承Dir,实现Dir类的print打印⽅法,不能实现添加⽂件、移除⽂件等⽅法。在调⽤类使⽤时,⽂件夹下可以添加⽂件或⽂件夹,⽂件下不能添加⽂件夹或⽂件
常⽤场景:View和ViewGroup,vViewGroup有容器的功能
7 适配器模式
解决问题:需要对两个⽆关系的两个类融合到⼀起,将不同的的东西通过⼀种转换使它们能够协作起来,listview、recycleview都需要使⽤到adapter,adapter就是 混⾎ 接⼝,将两个不同类的两种不同接⼝进⾏兼容,在不修改原有代码的情况下满⾜需求
设计思路:⾓⾊介绍:
Target:⽬标⾓⾊,也就是所期待获得的接⼝
Adaptee:现在需要适配的接⼝
Adapter:适配器⾓⾊,适配器需要把源接⼝转换成⽬标接⼝。所以adapter这⼀⾓⾊不可以是接⼝,必须是具体类
android简单教程可以定义多个不同的类,最后都通过adapter统⼀转成⼀个结果即可,譬如有5v、110v和220v的输⼊功率类,但是最后通过⾃定义adapter均转成5v的结果即可
常⽤场景:listview和recycleview的adapter使⽤
8 装饰模式
解决问题:动态地给⼀个对象添加⼀些额外的职责,就增加功能来说,装饰模式相⽐⽣成⼦类更加灵活。在需要透明且动态地扩展类的功能时
设计思路:⾓⾊介绍:
Component:抽象组件:可以是⼀个接⼝或抽象类,其充当的就是被装饰的原始对象
ConcreteComponent:组件具体实现类:该类是Component类的基本实现,也是我们装饰的具体对象
Decorator:抽象装饰者:其承担的责任就是为了装饰我们的组件对象,其内部⼀定有⼀个指向组件对象的引⽤,在⼤多情况下该类为抽象类,需要根据不同的装饰逻辑实现不同的具体⼦类
ConcreteDecoratorA/ConcreteDecoratorB:具体实现类
常⽤场景:Context与ContextImpl
9 享元模式
解决问题:对象池的⼀种实现,轻量级,⽤来尽可能的减少内存使⽤量,适⽤于可能存在⼤量重复对象的场景,缓存可共享的对象。
设计思路:共享对象分为内部对象和外部对象,可共享的对象称为内部对象,内部对象不会随着环境改变;不可共享的状态称之为外部状态,它们会随着环境变化⽽变化。在享元模式中会建⽴⼀个元对象容器,经典的享元模式中该容器为⼀个map,键就是享元对象的内部对象,值就是享元对象本⾝。以买票为例,同⼀个地点的车辆是有限的,这些就可以存起来,查询的时候直接调⽤不创建新的对象,先创建⼀个ticket接⼝,该接⼝定义展⽰车票信息的函数;然后新建⼀个TicketFactory类,定义⼀个static⽅法getTicket(from,to),这⾥的from、to拼接就相当于做享元模式的key⽤,然后⽤key做判断,如果没有这个key,就新建⼀个TicketFactory对象返回,如果有,⽅法直接返回已有的TicketFactory;在测试类中,直接调⽤TicketFactory类的getTicket(from,to)⽅法
常⽤场景:1 存在⼤量相似的相似对象 2 细粒度的对象都具备接近的外部状态,⽽且内部状态与环境⽆关,也就是说对象没有特定⾝份 3 需要缓冲池的情景
Handler、Message、android消息机制
10 外观观式
解决问题:就是统⼀接⼝封装,将⼦系统的逻辑、交互都隐藏起来,为⽤户提供了⼀个⾼层次的接⼝,使得系统更加易⽤,同时也对外隐藏了具体的实现。即使具体的⼦类发⽣了改变,⽤户也不会感知到
设计思路:以⼿机为例,先建⽴⼀个MobilePhone类,它有两个⼦功能拨号和拍照,MobilePhone可以封装起来提供统⼀的操作接⼝,只需要通过MobilePhone就可以打电话和拍照,⽤户可以忽略⼦功能背后做的⼀系列动作;定义⼀个phone接⼝和phoneImpl类,实现打电话的功能;定义⼀个camera接⼝和cameraImpl类,实现拍照功能;MobilePhone类中创建phone和camera的实类,定义调⽤它们打电话或拍照的⽅法,并提供给test类调⽤,即可。所以内部还可以增加Message接⼝和MessageImpl类,MobilePhone增加调⽤的⽅法,test类也不需要改动,只要调⽤新增的⽅法即可
常⽤场景:Context
github地址:
11 Builder模式
解决问题:是让⽤户在清楚流程的情况下⼀步⼀步创建⼀个复杂对象的创建模式,可以更精细地控制
对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得整个过程和部件的表⽰隔离开来,使⽤场景1、相同的⽅法,不同的执⾏顺序,产⽣不同的事件结果时 2、多个部件或零件,都可以装配到⼀个对象中,但是产⽣的运⾏时结果⼜不相同 3、产品⾮常复杂,或者产品类中的调⽤顺序不同产⽣了不同的作⽤,这个时候使⽤建造者模式⾮常合适 4 初始化⼀个对象特别复杂,如参数很多,且很多参数都具有默认值时
设计思路:Builder和Director两个类⼀起将⼀个复杂对象的构建与分离,director会对builder进⾏创建并封装起来,但不够灵活;如果需要灵活应⽤可以直接⽤builder设置需要的参数;如果builder要做到链式的编程,在builder的每个⽅法中return this才⾏
常⽤场景:AlertDialog.Builder
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论