# DesignModeTest **Repository Path**: lipc0113/DesignModeTest ## Basic Information - **Project Name**: DesignModeTest - **Description**: 设计模式 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-08-28 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DesignModeTest ##一、设计模式三大类: ###1.创建型模式 创建型模式涉及对象的实例化,特点是不让用户代码依赖于对象的创建或排列方式,避免用户直接使用new创建对象。 创建型模式有以下5个: 工厂方法模式、抽象工厂方法模式、建造者模式、原型模式和单例模式。 ###2.行为型模式 行为型模式涉及怎样合理的设计对象之间的交互通信,以及怎样合理为对象分配职责,让设计富有弹性,易维 护,易复用。 行为型模式有以下11个: 责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。 ###3.结构型模式 结构型模式涉及如何组合类和对象以形成更大的结构,和类有关的结构型模式涉及如何合理使用继承机制;和对 象有关的结构型模式涉及如何合理的使用对象组合机制。 结构型模式有以下7个: 适配器模式、装饰模式、代理模式、享元模式、外观模式、桥接模式和组合模式。 ##二、七大设计原则 ###1.开闭原则 可以通过“抽象约束、封装变化”来实现开闭原则 ###2.里氏替换原则 实现开闭原则的重要方式之一。 子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类 时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。 如果程序违背了里氏替换原则,则继承类的对象在基类出现的地方会出现运行错误。 这时其修正方法是:取消原来的继承关系,重新设计它们之间的关系。 ###3.依赖倒置原则 实现开闭原则的重要途径之一 依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中 只要遵循以下4点,就能在项目中满足这个规则。 1.每个类尽量提供接口或抽象类,或者两者都具备。 2.变量的声明类型尽量是接口或者是抽象类。 3.任何类都不应该从具体类派生。 4.使用继承时尽量遵循里氏替换原则。 ###4.单一职责原则 单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。 ####5.接口隔离原则 接口尽量小,但是要有限度。一个接口只服务于一个子模块或业务逻辑 ####6.迪米特原则 从迪米特法则的定义和特点可知,它强调以下两点: 从依赖者的角度来说,只依赖应该依赖的对象。 从被依赖者的角度说,只暴露应该暴露的方法。 所以,在运用迪米特法则时要注意以下 6 点。 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标。 在类的结构设计上,尽量降低类成员的访问权限。 在类的设计上,优先考虑将一个类设置成不变类。 在对其他类的引用上,将引用其他对象的次数降到最低。 不暴露类的属性成员,而应该提供相应的访问器(set 和 get 方法)。 谨慎使用序列化(Serializable)功能。 ####7.合成复用原则 它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑 使用继承关系来实现。 ##三、对23种设计模式的理解 **参考网址:http://www.runoob.com/design-pattern/bridge-pattern.html** **http://c.biancheng.net/design_pattern/** **适配器模式,装饰模式,代理模式,桥接模式,异同** a.适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。 b.装饰器模式特点在于增强,他的特点是被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。 c.代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。 d.桥接模式的特点在于分离。 a.代理模式和适配器模式最大的区别,代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,说白了,实现一个新的接口。 b.装饰器模式和代理模式的代码不同之处,代理模式一定是自身持有这个对象,不需要从外部传入。而装饰模式的一定是从外部传入 c.适配器模式和桥接模式最大的区别: 1)适配器:改变已有的两个接口,让他们相容。 2)桥接模式:分离抽象化和实现,使两者的接口可以不同,目的是分离。 3)桥接是先有桥,才有两端的东西;适配是先有两边的东西,才有适配器 d.桥梁模式与中介者模式 1)桥梁模式注重的是抽象与实现的分离 2)中介者模式注重的是多个同级别的类之间的相互协作 ###1.装饰者模式 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q115142115M2.gif) 作用:动态地给一个对象添加一些额外的职责。 个人理解: ###2.适配器模式 类适配器 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q1151045351c.gif) 对象适配器 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q1151046105A.gif) 作用:扩展已有类功能 个人理解: 参考网址:https://blog.csdn.net/YuenBin128/article/details/80314079 特别注意: 1、适配器模式也是一种包装模式,与之前的 Decorator 装饰模式同样具有包装的功能;此外, 对象适配器模式还具有显式委托的意思在里面(其实类适配器也有这种意思,只不过比较隐含而已),那么我在认为它与 Proxy 代理模式也有点类似; 2、从上面一点对比来看, Decorator 、 Proxy、 Adapter 在实现了自身的最主要目的(这个得看各个模式的最初动机、描述)之外,都可以在包装的前后进行额外的、特殊的功能上的增减,因为我认为它们都有委托的实现意思在里面; 3、我所看的书中说适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。 ###3.代理模式 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q115093011523.gif) 作用:为其他对象提供一种代理以控制对这个对象的访问 个人理解: ###4.桥接模式 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q115125253H1.gif) 作用:将抽象部分与实现部分分离,使它们都可以独立的变化 个人理解:主要是为了利用一些已经存在的类,去组合发展一些新功能 特别注意:与对象适配器模式相比,主要是两种类间的独立变化 ###5.外观模式 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q115152143509.gif) 作用:为子系统中的一组接口提供一个一致的界面 个人理解:将一组功能方法封装到一个类中。类似于平常使用的Presenter层中,将不同的Manager封装在一起,一般各个Manager与Presenter将实现一个统一接口方法 ###6.组合模式 ![](http://c.biancheng.net/uploads/allimg/181115/3-1Q1151G62L17.gif) 作用:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性 个人理解: 示例: public class Employee { private String name; private String dept; private int salary; private List subordinates; } ###7.享元模式 作用:主要用于减少创建对象的数量,以减少内存占用和提高性能 个人理解:将不同对象存储起来,以供复用 ###8.策略模式 ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q116103K1205.gif) 作用:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换 个人理解:解决使用 if...else 所带来的复杂和难以维护 ###9.状态模式 ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q11615412U55.gif) 作用: 个人理解:跟策略模式写法类似,但根据状态不同,而改变行为 ###10.命令模式 ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q11611335E44.gif) 作用: 个人理解:跟策略模式写法类似,但根据请求不同,去做不同的操作 ###11.责任链模式 ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q116135Z11C.gif) ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q11613592TF.gif) 作用:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止 个人理解: ###12.观察者模式 作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 个人理解: ###13.迭代器模式 作用:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示 个人理解:JAVA 中的 iterator实现 ###14.模板模式 作用:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 个人理解:activity的生命周期流程方法即是模版方法 ###15.备忘录模式 作用:保存一个对象的某个状态,以便在适当的时候恢复对象 个人理解:通过一个备忘录类专门存储对象状态 ###16.访问者模式(难度五星) ![](http://c.biancheng.net/uploads/allimg/181119/3-1Q11910135Y25.gif) 作用:主要将数据结构与数据操作分离 个人理解:是一种多对多的关系,多个类对同一组方法进行不同的操作,以实现数据结构与数据操作的分离 ###17.中介者模式 ![](http://c.biancheng.net/uploads/allimg/181116/3-1Q1161I532V0.gif) 作用:用一个中介对象来封装一系列的对象交互 个人理解: ###18.解释器模式(难度五星) 作用:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 个人理解: ###19.单例模式 ###20.原型模式 原型模式的克隆分为浅克隆和深克隆,Java 中的 Object 类提供了浅克隆的 clone() 方法,具体原型类只要实现 Cloneable 接口就可实现对象的浅克隆 ###21.工厂方法模式 ![](http://c.biancheng.net/uploads/allimg/181114/3-1Q114135A2M3.gif) 如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”, 它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”。 工厂方法模式的主要优点有: 1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 2.在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂 进行任何修改,满足开闭原则; 其缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系 统的复杂度。 ###22.抽象工厂模式 ![](http://c.biancheng.net/uploads/allimg/181114/3-1Q11416002NW.gif) 抽象工厂模式的扩展有一定的“开闭原则”倾斜性: 1.当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。 2.当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原 则。 另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。 ###23.建造者模式 ![](http://c.biancheng.net/uploads/allimg/181114/3-1Q1141H441X4.gif) 建造者(Builder)模式和工厂模式的关注点不同:建造者模式注重零部件的组装过 程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。