设计模式记录

设计模式的六大原则:
总原则:开闭原则,即对扩展开放,对修改关闭。
1 单一职责原则:每个类应该实现单一的职责,否则应该把类拆分。
2 里氏替换原则:任何基类可以出现的地方,子类一定可以出现。它是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
3 依赖倒转原则:这是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。
4 接口隔离原则:使用多个隔离的接口,比使用单个接口要好。每个接口不存在子类用不到却必须实现的方法,否则要将接口拆分。
5 迪米特法则(最少知道原则):一个实体应当尽量少的与其他实体之间发生相互作用,使得系统的功能模块相对独立。
6 合成复用原则:尽量使用合成/聚合方式,而不是使用继承。

本文以下都是总结设计模式核心思想和代码结构要点。帮助读者记忆。阅读前建议先阅读链接里面的具体讲解,理解设计模式本身再记忆

23中设计模式分类:
创建型模式:工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式 (简单工厂模式)
结构型模式:代理模式 装饰器模式 适配器模式 外观模式 组合模式 享元模式 桥接模式
行为型模式:观察者模式 责任链模式 模板方法模式 策略模式 迭代子模式 命令模式 状态模式 备忘录模式 访问者模式 中介者模式 解释器模式

1、Android 单例模式

1、一共五种方案。核心就是私有构造方法,使得创建的实例只有一个。以后都复用这个实例。
2、推荐使用带有synchronized线程保护的DCL方式,和静态内部类static final变量定义类的方式。3 、单例不会被主动释放,所以不是多场景调用,或在软件运行生命周期中长期使用的对象,不建议采用单例模式。

4 、单列模式需要考虑多线程调用时的数据安全,所以推荐使用2中的两种方式。

2、Android Builder模式

1 外部类私有构造方法带参数Buidler(静态内部类),Builder定义build方法创建外部类。

2 builder 多使用于参数较多的对象创建。比如android中view的创建。当对象拥有较多参数,但不同场景需要的参数不一定时,可考虑使用builder模式。

3 builder模式常见于android dialog的构造,以及view的构造。

4 builder模式下构建的对象,无法修改参数信息,所以对于内部参数频繁变动的对象构建,不建议使用builder模式。

3、Android 原型模式

1、原型模式就是一个拷贝。
2、实现implements Cloneable的clone方法,来提供类可以clone。
3、int string这种是值类型,类的对象叫引用类型。
4、数值拷贝没有深浅拷贝之分,注意引用变量拷贝,如果没有再次加clone方法,默认是浅拷贝。浅拷贝:获得变量本身,深拷贝:获得一个新的一模一样的变量。

最后,原形模式其实就是对象的拷贝,这跟C++/Object-C中的clone类似,容易出问题的也就在深浅拷贝上,使用原形模式可以解决复杂对象构建资源消耗的问题。也可以用来只读保护。注意其clone时不会走构造函数。

4、Android 工厂模式

1、工厂模式分为普通工厂模式、抽象工厂模式。
2、普通工厂模式产品用抽象类定义,抽象工厂的产品用接口定义。区别在于生产的产品上。普通工厂创建的都是具体的产品。而抽象工厂创建的时接口。因为接口是抽象出来的。所以叫抽象工厂。
普通工厂模式:生产具体的产品,创建的产品是类(Class)
抽象工厂模式:生产抽象的产品,创建的产品是接口(Interface)
3、工厂模式的优点在于对同类型的产品构建时,对外可统一构建方法。而内部根据不同类型,构建不同的实例对象。

  1)对外方法统一

  2)内部易于根据不同类型构建不同实现,方便统一管理。

-------------------行为型模式------------------

5、Android 策略模式

android策略模式,可简化业务管理。比如目前疫情问题,对疫情中心的目的是需要全民打疫苗,将这个任务派发给各个城市地区。具体各地区如何实现本地人员都打疫苗,是采用统一集中打,还是分不同群体打,或者其他办法。作为总体管理的疫情中心不用关注,它只用关注最后结果,全名都打了疫苗就行。

优点:
1、结构清晰,简单直观,作为业务管理,更加方便。
2、各个策略实现,不再限制实现方式,可根据各模块的更优方案去实现。
3、封装彻底,各模块不相互依赖。
缺点:
1 策略如果过多,子类变得繁多

2 如果业务发生变动,相关的所有策略都需要变更。

6、Android 状态模式

在一个业务中,如果执行方案需要根据不同的条件,执行不同的方向。可考虑使用状态模式。

优点:

1 可简化业务中的条件判断,简化逻辑实现。如同公司部分分工一样,财务,和人力,完全分开,使功能实现更纯净。

状态模式和策略模式的区别():

1、策略模式的侧重点是提供不同的方法(策略)。
2、状态模式的行为是由状态来决定,不同状态有不同的行为。

3 一个是被动需要根据不同条件做出不同实现,一个是主动根据自身所在场景,用不同方法去优化实现。状态模式是不得不做,策略模式其实是可以不做的。

7、Android 责任链模式

链式结构处理,A判断是否处理,如果处理请求终止,如果不处理传递给B,这样一直传递。形成链式结构。

比如我们常用到的登录业务,如果我们登录需要多个步骤,多次授权去实现。而我们的各个步骤又是严格安照先后顺序,需要逐步授权的话。就可考虑使用责任链模式。

优点:

1 责任链模式可以使我们的业务条理更加清晰,使业务顺序一目了然。

2 便于追踪业务流程,清楚当前所处环节,出现问题,更易定位。

8、Android 命令模式

“行为请求者”与“行为实现者”解耦。多个命令与行为一一对应。

优点:

1 行为请求和行为实现弱耦合,易扩展,修改,维护。

2 对外入口更易控制,封装行为入口。使代码更易阅读。

9、Android 观察者模式

如果业务中,多个模块都对同一数据的变话关注,需根据数据的变化做出不同响应,可采用观察者模式。

优点:

1、观察者和被观察者解耦

2、增强灵活性,解耦

3 ,如果有新业务需要观察被观察的数据变化,可直接添加观察即可。如我们加入感兴趣的群,群中有相关信息时,可直接通知到群里每人人员。


缺点:由于java代码的顺序执行,要考虑被察者的执行效率,多个观察者需要及时响应就得考虑异步的问题了。
观察模式核心:一个list合集,提供add,remove方法,遍历观察者,就是一个list的遍历。

10、Android 备忘录模式

用单独的类来保存和读取状态。避免直接访问数据和内部实现。
1、比如MP3,单独写一个类来保存歌名,播放百分比。退出则保存这些数据。再次进入就读取这些状态。

备忘录模式思想也很简单,保存之前状态。用单独的类来保存和读取状态。避免直接访问数据和内部实现。Activity的Bundle savedInstanceState就用了这种思想来保存之前的状态。

11、Android 迭代器模式

迭代器模式结构很简单,就是提供一个list的遍历方法。目的很明确,弱化遍历算法和容器之间的关系。其实我们平时开发之中已经很少需要自己去实现迭代器,因为现在不管是Object,C++,python等等,他们直接实现了这种结构。但是理解这种设计模式也是不错的。像Android源码中数据库中的游标Cursor也是用的这种结构。

12、Android 模板方法模式

流程封装,父类封装不可变方法。子类实现部分或全部可扩展方法。
1、代码结构。直接记Activity中的onCreate,onResume就是模板方法模式。

优点:封装不可变,扩展可变代码。提取公共代码便于维护
缺点:增加代码阅读难度。有的时候变得不好理解。

13、Android 访问者模式

1、被访问者不变。
2、根据访问者和被访问者的不同,两两对应达到不同的目的。
3、遍历被访问者实现“访问”。
4、代码结构记忆要点:
多个访问者都继承Visitor借口。根据visit的类型不同,达到不同的目的即:visit里写不同的操作。

public interface Visitor {
    public void visit(A a);
    public void visit(B b);
}

14、Android 中介者模式

中介者模式就是把网状复杂结构优化为一对多结构。起到协调作用。
1、代码结构记忆就是:部门长作为中介者来决策软件部、硬件部、产品部等之间合作调用关系。
2、我们常用的就是Activity当中介者,Button,TextView等各种状态来显示各种。Activity协调作用。一对多。

-------------------行为型模式------------------

15、Android 代理模式

为其他对象提供一种代理以控制这个对象的访问。
1、代理模式就是拥有被代理实例并代理它的方法,强调代理二字。
2、代理模式分为静态代理和动态代理。
3、静态代理就是直接创建一个代理类。包含所有需要代理的方法。代理调用一次。通常我们喜欢写一个Interface来约束需要代理的方法。
4、动态代理是SDK提供方法。等于用java反射来调用的需要代理的方法。所以称之为动态代理。

16、Android 组合模式(View与ViewGroup)

将部分整体的层次结构转换为树状结构,是的客户访问对象和组合对象具有一致性。
1、树状结构:Head、Node、Leaf
2、三节点写法类似。都继承一个抽象类。抽象类定义print,add,remove,getChild。
3、每个节点以一个ArrayList<>()来add remove子节点。并拥有一个遍历方法来操作。由于都继承自同一个抽象类。所以add remove的对象都可以用抽象类表示。
4、拥有add,remove,getChild的叫透明的组合模式。只有print的叫安全的组合模式。
5、透明的组合模式实现到Leaf节点的时候,继承抽象类的add,remove等方法都是空实现,因为没有子节点了。

17、Android 适配器模式(ListView与Adapter)

将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
1、有两个接口M,N,两个类A,B。A类实现接口M。现要让A也兼容N接口。
2、新建适配器类C,类适配器:C extends A implements N. 对象适配器:C implements N,C中拥有A实例
3、ListView和Adapter关系:新建适配器抽象类D。D implements N。兼容了N接口并且可以添加其他需要实现的方法。ListView以setAdapter来获得适配器。

18、Android 装饰者模式

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。和代理模式区分在于功能拓展,代理模式更强调代理二字。
1、装饰者抽象类。拥有被装饰者实例并调用方法。装饰者实现类则进行功能扩展。

19、Android 享元模式

缓存池思想“共享”对象,避免重复创建。
1、用map缓存,有就直接取用,没有时创建并push到map里。
2、Message单链表重复利用表头也可以。

20、Android 外观模式

提供统一接口,封装API。

21、Android 桥接模式

将抽象部分与实现部分分离,使它们都可以独立的进行变化。
1、实现部分独立,可以用接口或者抽象类实现
2、抽象部分拥有事项部分实例,并调用方法
3、实现部分主要是对抽象化的事物进一步的具体化操作
4、好处就是减少类的个数,如果只有一个维度,每有一个新的实现就要写一个新的类,如果是两个维度,就能避免多余类的书写

 例:

1、Android 单例模式
2、Android Builder模式
3、Android 原形模式(深浅拷贝)
4、Android 工厂模式
5、Android 策略模式
6、Android 状态模式
7、Android 责任链模式
8、Android 命令模式
9、Android 观察者模式
10、Android 备忘录模式
11、Android 迭代器模式
12、Android 模板方法模式
13、Android 访问者模式
14、Android 中介者模式
15、Android 代理模式
16、Android 组合模式(View与ViewGroup)
17、Android 适配器模式(ListView与Adapter)
18、Android 装饰者模式
19、Android 享元模式
20、Android 外观模式
21、Android 桥接模式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值