一、概述在此期间,系统查看了设计模式的相关内容,并分享了相关内容:
七个设计原则创建型模式(5种)结构型模式(7种)行为型模式(11种)
一般来说,设计模式分为三类:
有五种创造性模式:工厂方法模式、抽象工厂、单例模式、构建器模式和原型模式。
有七种结构模式:适配器模式、装饰器模式、代理模式、外观模式、桥梁模式、组合模式和享受模式。
共有11种行为模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、记忆模式、状态模式、访问者模式、中介者模式和解释者模式。
转载:https://www.cnblogs.com/Young111/p/10690599.html
二、七个设计原则
面向对象编程有七个原则,也就是经常提到的设计模式。提倡它的根本原因是重用代码和增加可维护性。设计模式就是为了实现这些原则,从而达到代码重用和增加可维护性的目的。
因为设计模式是基于这些原则的实现,所以有必要了解这些原则。
1、单一责任原则(SRP)
英文全称是Single Responsibility Principle,定义是一个类,改变的原因应该只有一个。阶级变化的原因是责任。如果一个类承担了太多的责任,就相当于把这些责任耦合在了一起。责任的改变可能会削弱或抑制该类完成其他责任的能力。这种耦合会导致脆弱的设计,当它改变时,设计会遭受意想不到的破坏。而要想避免这种现象,就要尽可能遵守单一责任原则。这个原则的核心是脱钩和增强凝聚力。
2.开闭原则(OCP)
英文全称是开闭原则,它定义了软件实体(包括类、模块、函数等。)应该对扩展开放,对修改关闭。开闭原则是面向对象设计中最重要的原则之一,其他许多设计原则都是实现开闭原则的手段。
3.里希特替代原理
英文全称是Liskov替换原理,是面向对象设计的基本原理之一。定义是任何基类都可以出现的地方,子类当然也可以出现。LSP是继承和重用的基石。只有当派生类可以替换基类,软件单元的功能不受影响时,基类才能真正被重用,派生类才能给基类添加新的行为。李希特替代原理是对开闭原理的补充。抽象是实现开放封闭原则的关键步骤,基类和子类的继承关系是抽象的具体实现,所以Richter替换原则是实现抽象的具体步骤的规范。
4.依赖倒置原理
英文全称是Dependence Inversion Principle,是开闭原则的基础。依赖倒置的原理要求调用者和被调用者都依赖抽象,这样他们之间就没有直接的联系和接触。在改变的时候,一方的改变不会影响另一方的改变。依赖倒置强调抽象的重要性。对于接口编程来说,依赖的是抽象而不是具体。
5.接口隔离原理(ISP)
英文全称是Interface Segregation Principle,意思是使用多个隔离的接口比使用单个接口更好。目的是降低类之间的耦合度,方便软件升级和维护。
6.至少知道原理(迪米特里原理)
一个实体应该尽可能少的与其他实体交互,这样系统的功能模块才相对独立。一般来说,不要和陌生人说话,也就是一个对象对其他对象的了解越少越好。迪米特里定律的初衷是减少类之间的耦合。由于每个类都尽可能减少对其他类的依赖,所以很容易使系统的功能模块独立运行,相互之间没有(或很少)依赖。
7.合成/聚合多路复用(CARP)
英文全称是Composite Reuse Principle,合成/聚合重用的原理通常称为合成重用原理。合成/聚合复用原理的潜台词是:我只是用了你的方法,我们不一定是同类。传承更耦合。例如,如果父类后来添加或删除了一个接口,子类可能会遭受毁灭性的编译错误。但如果只是组合聚合,只引用类的方法,就不会有那么大的风险,实现复用。
三、创建者模式(5种)
创造性模式意味着这些设计模式提供了一种在创建对象时隐藏创建逻辑的方法,而不是直接用new操作符实例化对象。这使得程序在判断给定实例需要创建哪些对象时更加灵活。
1.单一模式
定义
确保一个类只有一个实例,自己实例化,把这个实例提供给整个系统。
简介
单例模式不难理解。一个典型的例子就是一个公司只能有一个CEO。主要是保证一个类只有一个实例,类本身提供了返回实例的方法。在方法中,首先判断系统是否已经有这个单体,如果有,则返回,如果没有,则创建。如果创建多个实例会消耗太多资源,或者应该只有一个特定类型的对象,那么应该考虑singleton模式。
实现
Singleton模式不难理解,但是掌握几种常见的编写方式很重要。
饿汉风格:
公共类Singleton {//直接创建对象公共静态Singleton Instance = New Singleton();//private Singleton() {}//返回对象实例public static Singleton getinstance(){ return instance;}}懒惰型:
//写法1。惰性编写方法公共类singleton {私有静态singleton实例;//构造函数private private singleton(){ } public static synchronized singleton getinstance(){ if(instance = = null){ instance = new singleton();}返回实例;} }//方法二:DCL(双重检查锁)双重检查锁公共类singleton {私有易失静态singleton singletonprivate Singleton(){ } public static Singleton get Singleton(){ if(Singleton = = null){ synchronized(Singleton . class){ if(Singleton = = null){ Singleton = new Singleton();} } }返回单例;} }/写作方法三。静态内部类singleton模式公共类singleton {private singleton () {}公共静态final singleton getinstance(){ return singleton holder。实例;}私有静态类Singleton holder { private static final Singleton INSTANCE = new Singleton();}}上面第一种懒写方法实现了延迟创建和线程安全,但缺点是每次调用getInstance()都必须同步,效率很低。第二种DCL模式比较常见,判断空两次,第一次判断空避免不必要的同步,第二次保证单例的创建。这种模式挺好的,但是有时候在高并发环境下会有问题。最推荐第三种方法,线程安全也确保了实例的惟一性。
2.工厂方法模式
定义一个创建对象的接口,让子类决定实例化哪个类。
工厂方法模式有三种:通用工厂模式,就是建立一个工厂类,创建一些实现相同接口的类的实例。多工厂方法模式是对普通工厂方法模式的改进。在普通的工厂方法模式下,如果传递的字符串错误,就无法正确创建对象,而多工厂方法模式提供了多个工厂方法分别创建对象。静态工厂方法模式,将上述工厂方法模式中的方法设置为静态,无需创建实例即可直接调用。
3.抽象工厂
工厂方法模型的一个问题是,类的创建依赖于工厂类,即如果要扩展程序,必须修改工厂类,这违反了闭包原则。所以从设计上来说,存在一定的问题,如何解决?抽象工厂用于创建多个工厂类,这样一旦需要添加新的功能,就可以直接添加新的工厂类,而不需要修改之前的代码。
4.构建器模式(Builder)
工厂类模式提供了创建单个类的模式,而构建器模式将各种产品管理在一起,以创建一个复合对象。所谓复合对象,就是一个类有不同的属性。实际上,构建器模式是结合前面的抽象工厂和最后的测试得到的。
5.原型模式
定义
指定要用原型实例创建的对象种类,并通过复制这些原型来创建新对象。
简介
原型模式并不难理解,主要用在实例创建中,因为有时候通过new创建一个对象可能代价太大,所以我们可以考虑通过直接克隆实例来快速创建一个对象。克隆实例的内部属性与原始实例的内部属性一致。原型模式需要注意一个深抄和浅抄的问题。
四、结构型模式(7种)
结构模式关注于类和对象的结合。继承的概念用于组合接口,并定义组合对象获得新功能的方式。
1.适配器设计模式
适配器模式将一个类的接口转换成客户端期望的另一种接口表示,以消除接口不匹配导致的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式和接口的适配器模式。
类的适配器模式
公共类Source { public void method 1(){ system . out . println(“这是原始方法!”);} – ./*新类的方法*/public ovoid method 2();}公共类适配器扩展源实现Targetable { @ Override public void method 2(){ system . out . println(“这是Targetable方法!”);} } public class Adapter test { public static void main(String[]args){ Targetable target = new Adapter();target . method 1();target.method2()。对象的适配器模式的基本思想和类是一样的,只是修改了适配器类,这次不继承源类,而是持有源类的一个实例来解决兼容性问题。
公共类包装实现可作为目标的{ private Source source公共包装器(Source Source){ super();this.source = source} @ override public void method 2(){ system . out . println(“这是可作为目标的方法!”);} @ override public void method 1(){ source . method 1();}} -公共类adapter test { public static void main(String[]args){ Source Source = new Source();可设定目标=新包装器(源);target . method 1();target.method2()。接口模式接口的适配器是这样的:有时候我们用多个抽象方法写一个接口。当我们编写接口的实现类时,我们必须实现接口的所有方法,这显然有时是浪费的。这个时候我们可以用一个抽象类来实现接口和所有的方法,但是我们不处理原来的接口,只接触抽象类,所以我们写一个类,继承抽象类。
2.桥接模式
定义
将抽象部分和实现部分分开,这样它们都可以独立地改变。
简介
在软件系统中,有些类型由于自身逻辑的原因,会出现两个或多个维度的变化,那么如何处理这种“多维度的变化”呢?这需要使用桥接模式。桥接模式需要关注抽象部分、实现部分和解耦。一个典型的例子就是咖啡加糖的问题。抽象部分有Coffee,下面有LargeCoffee和allCoffee,实现部分有CoffeeAdd,下面有sugar和Normal。CoffeeAdd是在抽象咖啡中引用的,所以CoffeeAdd实际上是一个桥梁。
3.装饰图案
顾名思义,decorator pattern就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
4.组合模式
定义
这些对象被组合成一个树形结构来表示一个“部分-整体”层次结构,因此用户可以一致地使用单个对象和组合对象。
简介
组合模式比较简单理解。一个典型的例子就是假设A公司有不同的部门,不同的部分下有不同的员工,这样一个部门下的所有员工合并成一个部门,所有部门合并成整个公司。
5.外观模式
定义
为子系统中的一组接口提供一致的接口,外观模式定义了一个高级接口,使得子系统更易于使用。
简介
出诊模式的一个典型例子就是去医院看病,挂号,出门诊,划价,拿药,让患者或者家属觉得很复杂。如果有接待人员,接待人员办理起来非常方便。
6.享受元模式
定义
使用共享技术有效支持大量细粒度对象。
简介
当存在大量对象时,可能会导致内存溢出。我们把通用的部分抽象出来,如果有相同的业务请求,我们会直接返回内存中已有的对象,避免重新创建。
7.代理模式
定义
为其他对象提供代理以控制对此对象的访问。
简介
代理模式主要解决直接访问对象带来的问题。比如猪八戒去找高翠兰,孙武空就变了。可以这样理解:抽象出高翠兰的样子,高翠兰本人和孙武空都实现了这个界面。猪八戒拜访高翠兰时,分不清是孙武空,就说孙武空。
五、行为型模式 ( 11种 )
这些设计模式特别关注对象之间的通信。
1.模板方法模式
定义
运算中的一个算法的框架,同时把一些步骤延迟给子类,让子类在不改变算法结构的情况下,重新定义一个算法的一些具体步骤。
例子
模板方法模式的典型例子是AsyncTask,Android中的异步任务类,封装了异步任务的执行。当子类继承它时,只需要在指定的过程中实现特定的操作。
2.命令模式
定义
将一个请求封装成一个对象,这样客户就可以参数化不同的请求;排队或记录请求,并支持可取消的操作。
简介
命令模式主要是通过调用方调用接收方执行命令。在这种模式下需要理解的角色有三个:(1)接收者真正的命令执行对象;(2)命令持有对接收方的引用,并调用接收方的相关方法。(invoker请求者持有对命令的引用,调用命令的方法来执行特定的命令。
3.迭代器模式
定义
提供一种方法来顺序访问聚合对象中的元素,而不公开对象的内部表示形式。
简介
在Ja集合框架中,我们知道对于给定的集合类,我们可以使用特定的迭代器遍历集合中的所有元素。这样,迭代器模式就容易理解了。
4.观察者模式
定义
定义对象之间的一对多依赖关系。当对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。
简介
观察者模式结合Android中的ListView可以理解。当数据发生变化时,与ListView关联的适配器会通过notifyDataSetChanged()方法通知界面刷新。
5.中介模型
定义
用中介对象封装一系列对象交互。中介使对象没有必要显式地相互引用,从而使它们的耦合变得松散,并独立地改变它们的交互。
简介
中介模式的一个典型例子是,各国在加入世贸组织之前相互进行贸易,结构复杂。大家都加入世贸组织后,各国通过世贸组织互相交易,变得规范化。
6.纪念品图案
定义
捕获对象的内部状态,并在不破坏封装的情况下将其保存在对象外部。这样,对象可以在以后恢复到保存状态。
简介
memento模式的一个典型例子是git版本管理工具,它帮助我们在每次提交后保存项目状态,必要时我们可以退回到指定的版本。
7.解释器模式
定义
给定一种语言,定义其语法的表示,并定义一个解释器,解释器使用该表示来解释该语言中的句子。
简介
解释器的一个典型例子是它在编译原理中的应用。如果某个特定类型的问题出现得足够频繁,那么用简单的语言将问题的每个实例表达成一个句子可能是值得的。这样就可以构造一个解释器,通过解释这些句子来解决问题。
8.状态模式
定义
允许对象在其内部状态改变时改变其行为。该对象似乎已经修改了它的类。
简介
状态模式主要解决对象的行为依赖于其状态(属性)的问题,可以根据其状态变化改变其相关行为。一个典型的例子就是,一个人在不同的状态下完成一件事情,可能会有不同的结果。
9.战略模式
定义
定义一系列算法,一个一个封装,使之可替换。这种模式使算法能够独立于使用它的客户进行更改。
简介
从策略模式的定义可以看出,它主要是把算法和客户分开。典型的例子是排序算法。我们给出一个数组,输出排序后的结果,但是在这个过程中可以采用不同的排序算法。这些算法实际上是策略。
10.责任链模型
定义
使多个对象有机会处理请求,从而避免请求的发送方和接收方之间的耦合关系。将这些对象连接成一个链,并沿着这个链传递请求,直到有对象处理它。
简介
责任链模式(Responsibility chain mode)避免了请求的发送方和接收方的耦合,使得多个对象接收请求成为可能,将这些对象连接成一个链,并沿着这个链传输请求,直到一个对象处理它。
11.访问者模式
定义
封装了一些作用于数据结构中元素的操作。它允许你在元素上定义新的操作而不改变它们的类。
简介
访问者模式是一种将数据操作与数据结构分离的设计模式。它通常在对象结构中是稳定的,但往往需要在这个对象结构上定义新的操作,或者在一个对象结构中的对象上执行许多不同的、不相关的操作,并且需要避免这些操作“污染”这些对象的类,并通过访问者模式将其封装到类中。
觉得有用的朋友多帮忙转发!后面会分享更多关于devops和DBA的内容,感兴趣的朋友可以关注一下~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。