分享
找到了一篇文章里面对组合模式的分析挺不错的:https://www.cnblogs.com/chenssy/p/3299719.html。这里我只简单记录下我理解的组合模式。
个人理解
- 具有组合关系并不算是使用了组合模式
- 透明方式比安全方式更贴合组合模式的原则
必须要具备树形结构才适合用到组合模式。所以,感觉组合模式和递归是分区不开的。
锈在一起的三角铁
找到了一篇文章里面对组合模式的分析挺不错的:https://www.cnblogs.com/chenssy/p/3299719.html。这里我只简单记录下我理解的组合模式。
必须要具备树形结构才适合用到组合模式。所以,感觉组合模式和递归是分区不开的。
找到了一篇文章里面对享元模式的分析挺不错的:https://blog.csdn.net/justloveyou_/article/details/55045638。但是这里我想聊一些别的方面,关于我们实际用享元模式的思考。
在我实际写业务代码时,发现自己很少去用到享元模式,主要有三方面因素:
反过来想,传统的使用Spring写的三层架构中的Service层,Spring就将我们写的Service初始化成了一个单例实例,而且Spring充当了工厂角色,Service Interface充当了Flyweight角色,ServiceImpl充当了Concrete Flyweight角色,而我们Service 方法的参数其实就是Unsharable Flyweight角色,只不过此场景不是细粒度对象的复用,而是大对象的复用。
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。
外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。
外观(Facade)模式的主要缺点如下。
外观(Facade)模式包含以下主要角色。
装饰(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰(Decorator)模式的主要优点有:
其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。
装饰模式主要包含以下角色。
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式的优点是:
由于抽象与实现分离,所以扩展能力强;
其实现细节对客户透明。
缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
桥接(Bridge)模式包含以下主要角色。
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
代理模式的主要角色如下。
适配器模式(Adapter)包含以下主要角色。
通过对比发现这两种模式都有三个角色,只考虑对象适配器的话,写出的代码结构类似如下:
class ObjectAdapter implements Target
{
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.specificRequest();
}
}
都是让Proxy或者Adapter类实现客户端真正调用的接口(Target或者Subject)。我个人理解,适配器和代理模式在使用上没有太大的差别,根本的区别是认知上的处理问题的场景。或者是,代理模式一般是不需要做额外工作的(只有类似加日志这种操作),而适配器模式是需要做适配工作的。
根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。
根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。
创建型模式的主要关注点是“怎样创建对象?”,关注点分离原则,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。创建型模式由两个主导思想构成。一是将系统使用的具体类封装起来,二是隐藏这些具体类的实例创建和结合的方式。
创建型模式分为以下几种。
以上 5 种创建型模式,除了工厂方法模式属于类创建型模式,其他的全部属于对象创建型模式。
创建型模式又分为对象创建型模式和类创建型模式。对象创建型模式处理对象的创建,类创建型模式处理类的创建。详细地说,对象创建型模式把对象创建的一部分推迟到另一个对象中,而类创建型模式将它对象的创建推迟到子类中。
工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
工厂方法模式的主要优点有:
其缺点是:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度
工厂方法模式的主要角色如下。
在spring中我们配置的xml或者使用spring框架写的某个实现了抽象工厂的类,都是工厂方法模式的使用场景。最典型的场景,配置DBResource。
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当增加一个新的产品族时不需要修改原代码,满足开闭原则。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。现在我们来分析其基本结构和实现方法。
抽象工厂模式的主要角色如下。
抽象工厂模式适用于创建一组(多种)对象的场景,工厂方法模式使用于创建一种对象的场景,简单来说,工厂方法模式有一个创建对象的方法,抽象工厂模式有多个创建不同对象的方法。
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程(之前比较疑惑面向接口编程与依赖倒置的关系,这句话算是解惑了)。
所以,IOC是DIP的继承,DI是IOC的实现,如下所示:
7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;单一职责原则告诉我们实现类要职责单一;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合度;合成复用原则告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。
此文章不是我写的,是来自于我之前的团队的,主要是我们当时的leader@闫华做的,微信搜索codeasy可以关注他的公众号。个人觉得此模板还是很不错的,按照这个模板既可以锻炼大家写设计的能力,又能让大家对自己的系统产生一定的思考,所以想要给大家分享出来。因为是维护在内网,要不然我只需要分享一个链接就好了。。。以下是内容:
此部分必须要有。
回答以下内容:
但不限于以上这些内容。这部分非常重要但要高度凝练,要简洁。目的是提供必要的背景知识,以便读者理解下面章节的内容。
这部分可以与产品经理一起,紧密协作编写。
此部分必须要有。
领域模型是对业务的一个抽象建模,可以用粗类度的类图(类和类的关系)来表示,并加上必要的名词解释。
如果领域对象特别多,有必要建立分组。如何分而治之,可以参考DDD的界限上下文的分析方法。
领域模型是和技术无关的,所以,领域模型不等同于表设计,这里不应该出现表设计相关的内容。
领域模型非常重要,没有特殊情况,本部分必须要有。特殊情况请说明。
这部分可以与产品经理一起,紧密协作编写。