阿里P7大牛细说架构——设计模式专栏

发布者: 发布时间:2021-08-01
本文摘要:设计模式先容对于有履历的开发人员,学习设计模式有助于我们找到在软件开发历程中所面临的问题的最佳解决方案。

设计模式先容对于有履历的开发人员,学习设计模式有助于我们找到在软件开发历程中所面临的问题的最佳解决方案。一直以来软件都是为了用来解决现实生活中遇到的庞大问题而存在,设计模式(Design pattern)就像一套基础武功心法,每一式都代表了一类问题的最佳实践,且可凭据实际情况组合使用。本系列文章笔者将带大家一起从零开始学习设计模式,后面会逐个剖析23种设计模式在Java中的详细实现,读者需具备基本的Java编程观点。

体育竞猜平台

文末有福利放送,谢谢读者的阅读。设计模式(Design pattern)代表了最佳的实践,通常被有履历的面向工具的软件开发人员所接纳。设计模式是软件开发人员在软件开发历程中面临的一般问题的解决方案。

这些解决方案是众多软件开发人员经由相当长的一段时间的试验和错误总结出来的设计模式可以通过提供经由测试和验证的开发规范来加速开发历程重用设计模式有助于防止可能导致重大问题的微妙问题,同时也提高了熟悉模式的法式员和架构师的代码可读性什么是GOF(四人帮,全拼Gang of Four)在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出书了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向工具软件元素) 的书,该书首次提到了软件开发中设计模式的观点。四位作者合称 GOF(四人帮,全拼 Gang of Four)。

他们所提出的设计模式主要是基于以下的面向工具设计原则。对接口编程而不是对实现编程。优先使用工具组合而不是继续。用途设计模式的主要用途有两个,一是提供了一个尺度的术语系统,且详细到特定的场景。

如单例设计模式意味着使用单个工具,这样所有熟悉单例设计模式的开发人员都能使用单个工具,而且可以通过这种方式告诉对方,法式使用的是单例模式。二是提供了最佳的实践,设计模式已经履历了很长一段时间的生长,它们提供了软件开发历程中面临的一般问题的最佳解决方案。

学习这些模式有助于履历不足的开发人员通过一种简朴快捷的方式来学习软件设计设计模式的类型凭据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向工具软件元素) 中所提到的,总共有 23 种设计模式。这些模式可以分为三大类:建立型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。另有另一类设计模式:J2EE设计模式。

这些设计模式从易到难可以分为三个品级:Difficulty-Beginner(难度-初学者), Difficulty-Intermediate(难度-中级) & Difficulty-Expert(难度-专家),后续文章我将从易到难的为大家先容差别类型的设计模式。下面一张图片整体形貌了一下设计模式之间的关系:设计模式的六大原则1、开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在法式需要举行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

简言之,是为了使法式的扩展性好,易于维护和升级。想要到达这样的效果,我们需要使用接口和抽象类,后面的详细设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)里氏代换原则是面向工具设计的基本原则之一。里氏代换原则中说,任何基类可以泛起的地方,子类一定可以泛起。

LSP 是继续复用的基石,只有当派生类可以替换掉基类,且软件单元的功效不受到影响时,基类才气真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的增补。

实现开闭原则的关键步骤就是抽象化,而基类与子类的继续关系就是抽象化的详细实现,所以里氏代换原则是对实现抽象化的详细步骤的规范。3、依赖倒转原则(Dependence Inversion Principle)这个原则是开闭原则的基础,详细内容:针对接口编程,依赖于抽象而不依赖于详细。4、接口隔离原则(Interface Segregation Principle)这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。

它另有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。5、迪米特规则,又称最少知道原则(Demeter Principle)最少知道原则是指:一个实体应当只管少地与其他实体之间发生相互作用,使得系统功效模块相对独立。

6、合成复用原则(Composite Reuse Principle)合成复用原则是指:只管使用合成/聚合的方式,而不是使用继续。设计模式的思考在学习和明白设计模式之前,你应该熟悉一些编程/软件设计原则。所有的设计都应该尽可能简朴,从最简朴的事情开始,逐步延伸,这可能是事情学习的原理。

体育竞猜平台

只有在实际要求可扩展性,需要庞大性和套路模式时,才应该引入它们(设计模式)。一旦你熟悉了这些设计模式的观点,你就可以凭据实际工程情况选择最适合的模式来优雅的实现工程目的。工厂模式工厂模式也被称之为虚拟结构函数(Virtual Constructor),是Java中最常用的设计模式之一。

这种类型的设计模式属于建立型模式,它提供了一种建立工具的最佳方式。在工厂模式中,我们在建立工具时不会对客户端袒露建立逻辑,而且是通过使用一个配合的接口来指向新建立的工具意图界说用于建立工具的接口,可是让子类决议实例化哪个类。factory方法允许类将实例化推迟到子类主要解决:接口选择的问题。

何时使用:我们明确地计划差别条件下建立差别实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产物。关键代码:建立历程在其子类执行。解释现实世界的例子铁匠制造武器。

精灵需要精灵武器,兽人需要兽人武器。凭据手头的主顾,召荟萃适类型的铁匠简而言之它提供了一种将实例化逻辑委托给子类的方法维基百科说In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.(在基于类的编程中,factory方法模式是一种建立模式,它使用factory方法来处置惩罚建立工具的问题,而不必指定将要建立的工具简直切类。这是通过挪用factory方法(在接口中指定并由子类实现,或者在基类中实现并可选地由派生类重写)来实现的,而不是通过挪用结构函数来实现的。

)法式代码示例以现实世界的例子铁匠制造武器为例子,需要什么样的武器类型我们就召唤对应类型的铁匠。法式类图如下:铁匠接口实现类图.png首先我们有一个铁匠接口(界说了一个制造武器的方法)和一些精灵铁匠、兽人铁匠实现类:public interface Blacksmith { Weapon manufactureWeapon(WeaponType weaponType);}public class ElfBlacksmith implements Blacksmith { public Weapon manufactureWeapon(WeaponType weaponType) { return new ElfWeapon(weaponType); }}public class OrcBlacksmith implements Blacksmith { public Weapon manufactureWeapon(WeaponType weaponType) { return new OrcWeapon(weaponType); }}其次我们有一个武器接口(界说了一个获取武器类型的方法)和一些精灵武器、兽人武器实现类:/*** Weapon interface.*/public interface Weapon { WeaponType getWeaponType();}/*** ElfWeapon.*/public class ElfWeapon implements Weapon { private WeaponType weaponType; public ElfWeapon(WeaponType weaponType) { this.weaponType = weaponType; } @Override public String toString() { return "Elven " + weaponType; } @Override public WeaponType getWeaponType() { return weaponType; }}/*** OrcWeapon.*/public class OrcWeapon implements Weapon { private WeaponType weaponType; public OrcWeapon(WeaponType weaponType) { this.weaponType = weaponType; } @Override public String toString() { return "Orcish " + weaponType; } @Override public WeaponType getWeaponType() { return weaponType; }}最后,随着主顾的到来,正确类型的铁匠被召唤出来,要求制造武器public class App { private static final Logger LOGGER = LoggerFactory.getLogger(App.class); private final Blacksmith blacksmith; /** * Creates an instance of <code>App</code> which will use <code>blacksmith</code> to manufacture * the weapons for war. * <code>App</code> is unaware which concrete implementation of {@link Blacksmith} it is using. * The decision of which blacksmith implementation to use may depend on configuration, or * the type of rival in war. * @param blacksmith a non-null implementation of blacksmith */ public App(Blacksmith blacksmith) { this.blacksmith = blacksmith; } /** * Program entry point * * @param args command line args */ public static void main(String[] args) { // Lets go to war with Orc weapons App app = new App(new OrcBlacksmith()); app.manufactureWeapons(); // Lets go to war with Elf weapons app = new App(new ElfBlacksmith()); app.manufactureWeapons(); } private void manufactureWeapons() { Weapon weapon; weapon = blacksmith.manufactureWeapon(WeaponType.SPEAR); LOGGER.info(weapon.toString()); weapon = blacksmith.manufactureWeapon(WeaponType.AXE); LOGGER.info(weapon.toString()); }}运行App法式效果:app类运行效果输出.png适用场景当遇到如下三种情况时,应使用工厂模式:一个类不能预测它必须建立的工具的类一个类希望它的子类指定它建立的工具类将责任委托给几个助手子类中的一个,而且你希望当地化哪个助手子类是委托的责任Java中的现实例子java.util.Calendarjava.util.ResourceBundlejava.text.NumberFormatjava.nio.charset.Charsetjava.net.URLStreamHandlerFactoryjava.util.EnumSetjavax.xml.bind.JAXBContext优缺点优点:一个挪用者想建立一个工具,只要知道其名称就可以了。

扩展性高,如果想增加一个产物,只要扩展一个工厂类就可以。屏蔽产物的详细实现,挪用者只体贴产物的接口缺点:每次增加一个产物时,都需要增加一个详细实现类和修改工具实现工厂,使得系统中类的个数成倍增加,在一定水平上增加了系统的庞大度,同时也增加了系统详细类的依赖。这并不是什么好事最后工厂模式作为一种建立类模式,在任何需要生成庞大工具的地方,都可以使用工厂模式,好比设计一个毗连服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产物类,配合实现一个通讯接口。

对于简朴工具,特别是只需要通过new就可以完成建立的工具,无需使用工厂模式,因为使用工厂模式一定要引入一个工厂类,这会增加系统的庞大度,切不行为了设计模式而模式。之后我们将在工厂模式的基础上继续延伸先容抽象工厂模式,难度系统为中级下面是笔者给列位准备的福利:高可用架构篇第01节--ZooKeeper集群的安装、设置、高可用测试第02节--ZooKeeper集群的升级、迁移第03节--ActiveMQ高可用集群(ZooKeeper+LevelDB)安装、设置、高可用测试第04节--ActiveMQ高可用+负载平衡集群的安装、设置、高可用测试第05节--Redis集群的安装(Redis3+CentOS)第06节--Redis集群的高可用测试(含Jedis客户端的使用)第07节--Redis集群的扩展测试第08节--Keepalived+Nginx实现高可用Web负载平衡第09节--FastDFS集群的安装第10节--FastDFS集群的设置第11节--FastDFS集群的使用(联合浅易版支付系统)第12节--使用Redis3.0集群实现Tomcat集群的Session共享第13节--MySQL源码编译安装(CentOS-6.6+MySQL-5.6)第14节--MySQL主从复制的设置(CentOS-6.6+MySQL-5.6)第15节--MyCat在MySQL主从复制基础上实现读写分散第16节--MyCat集群部署(HAProxy+MyCat)第17节--MyCat高可用负载平衡集群实现(HAProxy+Keepalived+MyCat)关注我:私信回复“架构资料”获取往期Java高级架构资料、视频Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、漫衍式、高并发等架构技术资料获取方式关注+转发后,私信关键词 【架构】即可获取!重要的事情说三遍,转发、转发、转发后再发私信,才可以拿到!。


本文关键词:体育竞猜平台

本文来源:体育竞猜平台-www.draka-bg.com