设计模式总结

        前面的文章已经把每一种设计模式都进行了介绍。接下来对每种模式进行简要的概括总结,便于记忆。我就从创建型、结构型和行为型三个大类进行概括。、

1.创建型模式
         一个类只需创建一次对象,而后只需要使用第一次创建的对象即可,利用一个类变量来存储该对象。特殊情况:多线程下,则需要使用double-check,即volatile和synchronized的配合使用。

        简单工厂模式将对象的生成放在简单工厂类中创建,所有对象都放入一个工厂类中创建。
        其实工厂方法模式是在简单工厂模式基础上对产品进行分类,即一种产品一个工厂,这样使得工厂类代码不会过于庞大。
        抽象工厂模式是在前两者工厂模式继续改进,将工厂类从复杂的逻辑判断中解放出来。即为每个工厂共同创建一个工厂的工厂,在这个工厂的工厂里面进行逻辑判断,即判断何时使用什么工厂来创建什么产品对象。
        生成器负责封装一个产品复杂的创建过程。而且产品创建将一类产品的创建步骤一般化,针对具体产品则调用相应的具体过程即可。这也是它与工厂模式的区别,工厂模式是直接创建一个对象,而生成器模式将创建过程细化到每一个步骤。
        一般来说原型模式就是类似克隆,就是实现了Cloneable接口,这个实例的克隆是给每个克隆出来实例分配内存的,这也是区别于单例模式的地方。

2.结构型模式
        适配器模式就类似于一个接口,将两者不匹配的东西联系起来。比如想把A变成B,那么适配器则应实现B类接口,然后在内部调用A的方法,封装A的方法,因此相当于产生一个外部看起来是B,内部表现却是A。
        桥接模式就是将一个类的两个及两个以上的维度的影响因素抽离出来,分别形成接口,并实现可能的具体类,那么对于具体产品的时候只需要调用相应的类即可。比如一碗面里辣味程度和菜是两个维度的影响因素,分别抽离出来成两个接口,并实现具体类,比如辣味程度分为很辣、不辣等,而菜有牛肉面、猪肉面等。那么桥接模式使得具体只需要选取合适的因素即可,比如很辣的猪肉面,只需要调用很辣类和猪肉面类即可。使得每个类单一职责,并且灵活性比较好,尤其具体产品比较多的时候,每个具体产品一个类则十分麻烦。
        组合模式则体现了类树的概念,即一个类节点包含几个子节点依次类推,类树中有一个根节点,即该类树都要实现的接口。这样统一接口,便于对象的调用。具体来说就像总经理带两个部门经理,而部门经理A带三个员工,B带两个员工,这种层次关系就形成了类树,而这些树上的节点都实现员工接口,那么就会将这棵树统一了接口。组合模式强调的是整体/部分结构;而桥接模式则是强调的是平行结构,即同一级类之间的组合。
        装饰器模式则是能够动态地为对象添加职责。比如本来有一个普通的机器人,然后再给它添加了两个机器部件,便能够跳舞和唱歌,这就是动态添加职责。装饰器中比较常见的就是IO流中:
InputStream in=new FileInputStreanm("xxx.txt");
in=new BufferedInputStream(in);
in=new LowerCaseInputStream(in);
        外观模式就相当于给一堆同层次的类提供一个对外的类,即提供一个门面,使得客户端每次调用不需要直接调用每个类,而是通过调用这个对外的类实现功能。比较常见的是Service层的类就是这些对外的类,而这些类就是DAO组件类的门面。使用了外观模式,可以使得外部只需要访问门面类就可以,而不需要访问内部具体类。
        享元模式简单来说就是一个工厂模式并且要求工厂里创建的对象都符合单例模式。它拥有一个对象集合用来存储对象,比如外部需要一个产品,然后工厂类便会调用工厂类的方法,而该方法则会先判断对象集合有没有该产品,没有则创建并存储,如果有则取出来使用。
 代理模式通俗来说就是替身。如果有一个类创建对象开销十分大,则需要使用替身来实现与该类相同的功能时,这里则需要 使用代理模式用一个对象代表另一个控制对象访问。另外常见的代理就是动态代理,而典型的动态代理便是AOP代理。

3.行为型模式
责任链模式则是对于一个对象的处理,如果当前类能够处理则进行处理,如果当前类处理不了则交给下一个类处理,直到链尾。就如同在公司需要加工资,假设加工资是总经理说了算的,你先找项目经理,结果项目经理处理不了,让你去问人事,人事也说不在职责之内,让你问总经理,结果总经理能处理,就帮你解决了。这就是责任链模式。
命令模式将“请求”封装成对象以便使用不同的请求、队列或者日志来参数化其它对象。将不同命令接口的匿名实现类作为参数传入某个方法,这个只需要方法调用该对象参数的某个方法即可,并不关心这个被调用方法的真正实现。因此,命令模式相当于将命令从类中分离出来。比如电视机、空调等有打开和关闭等命令,现在将开和关分离出来独自成类,如果需要开电视只需要将电视对象传入相应的开命令即可。
解释器模式相当于将每种语法都定义成一个解释器,解释器有一个interpret方法,该方法需要将将context对象传入,而在context类中,则需要建立一个集合,用来存储每种解释器对象。
        迭代器模式则使用在需要遍历一个集合中的元素,又不想暴露其内部表现的时候常常使用。我们常见的就是ArrayList集合利用Iterator iterator方法来进行元素的遍历就是使用了迭代器模式。
        中介者模式是通过一个中间类将两个毫无联系的类连接起来,省去了两个类重新认识的代价,就如同房地产中介一般将买房的人与房源联系在了一起,将这两个毫无联系的类完全解耦。
备忘录模式主要有三个主角,一个便是Memento类,负责保存原发器某一时刻的状态。第二个便是Originator类即原发器(这里指人),原发器中拥有创建Memento对象的方法。第三个便是Caretaker类即备忘录管理者。整个备忘录模式工作流程是1.如果某一时刻的状态需要保存为备忘录,那么通过调用Originator类方法负责创建Memento对象,2.将Memento对象传入Caretaker类负责保存,3.如果需要获取某一时刻的状态,则先调用Caretaker相应方法获取备忘录。4.然后寻找相应备忘录对象,传入Originator获取状态。
观察者模式中观察者负责掌握着数据,一旦观察者得知数据发生改变,则要通知与数据相关的对象。即观察者有个通知方法,而且还有一个集合,负责存储与数据相关的对象。当数据发生改变时,观察者类的通知方法中便会逐个遍历对象集合中对象元素,并调用它们的更新方法,即起到了通知被观察者的作用。
状态模式则是将每种状态分离出来各自成类。而Context类负责转换状态。这样就不用在状态转换时有着复杂的逻辑关系。降低了状态之间的依赖性。
        策略模式将一个对象每种行为抽离出来,抽象化然后创造具体实现类,然后这个物体只需要调用自己所需要的行为即可。比如有一个鸭子接口,而鸭子有叫和走路等行为,现在将这两种行为抽象成接口,然后具体实现。然后创造一个具体的鸭子,则需要实现鸭子接口,并且需要调用相应的行为方式类的方法。其中鸭子类中对于各种行为方式采用组合对象。
模板方法将一些流程相似的过程定义一个模板,该模板是一个抽象类,同样的流程则具体实现,而有差异的流程则在具体实现类中具体实现。比如煮咖啡和煮茶有的流程一样则在模板类中具体实现,而有的流程不同比如一个放茶叶、一个放咖啡,则在具体流程类中具体实现。
        访问者模式是针对几个对象操作随着应用不同有可能会发生改变,那么将这些操作放在访问者类中集中管理即可,应用改变的时候只需要改变访问者类。访问者类中拥有对每一个对象都有visit方法,而每个被访问者都有一个accept方法用来调用访问者类的相应的visit方法,表示接受访问。


        以上是所有设计模式的一个简单的概括,如果需要了解具体细节的,可以点开相应的设计模式名字链接,即可进入对应的设计模式详解。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值