UML第二部分和结构型模式的总结

UML第二部分和结构型模式的总结

物理视图

物理视图对应用自身的实现结构建模,例如系统的构件组织和建立在运行节点上的配置。这类视图提供了将系统中的类映射成物理构件和节点的机制。物理视图有两种:实现视图和部署视图。

实现视图

实现视图将系统中可重用的块包装成具有可替代性的物理单元,这些单元称为构件。实现视图用构件以及构件之间的接口与依赖关系来表示设计元素的具体实现。构件是系统高层的可重用的组成部件。

构件:构件是作为系统可替换部分,具有良好定义的接口的物理实现单元。

部署视图

部署视图表示运行时计算资源的物理布置。这些运行的资源称为节点。在运行时,节点包含构件和对象。构件和对象的分配可以是静态的,它们可以在节点之间迁移。如果含有依赖关系的构件实例放在不同的节点上,部署视图可以展示执行过程中的瓶颈。

结点:结点是代表运行资源的运行时的物理对象,它们至少拥有内存且常常具有运算能力。

模型管理视图

任何大系统必须被划分为较小的单元,以使人们可以在某一时刻与有限的信息工作,使团队中的工作不相互影响。模型管理包括包(包含了特殊种类的包)和包之间的依赖关系。

包是一部分模型,模型的每个部分必须属于某个包。包包含了顶层模型元素。包可以包含其它的包,存在一个根包间接的包含了整个系统的模型。

包的依赖

依赖由单独的元素所引发,但对于任何规模的系统,它们必须在较高的层次观察。包之间依赖的出现暗示着在自底向上的路径(存在的声明)中,或者允许在自顶向下的路径(限制了其它关系的约束)中稍后存在着,在相应包内的元素个体间至少存在一个给定依赖类型的关系元素。

访问和引入依赖

包是不透明的,通常包不能访问其它包的内容,除非被访问和引入依赖所打开。访问依赖直接应用于包和其它容器。引入依赖用于在客户包的名字空间增加名字,作为全路径的别名。

模型和子系统

模型是包含了系统特殊视图完整描述的包。

子系统是具有独立的说明和实现部分的包。

结构型模式

 

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

一.适配器模式 

分类
类适配器、对象适配器、接口适配器

适配器模式应用场景

(1)想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。

(2)我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。

(3)想要使用接口中的某个或某些方法,但是接口中有太多方法,我们要使用时必须实现接口并实现其中的所有方法,可以使用抽象类来实现接口,并不对方法进行实现(仅置空),然后我们再继承这个抽象类来通过重写想用的方法的方式来实现。这个抽象类就是适配器。

装饰器模式

装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

代理模式

特点:
1、 执行者、 被代理人
2、 对于被代理人来说, 这件事情是一定要做的, 但是我自己又不想做或者没有时间做, 找代理。
3、 需要获取到被代理的人个人资料。
4、关心过程

AOP中使用场景

事务代理(声明式事务, 哪个方法需要加事务, 哪个方法不需要加事务)

日志监听

 

外观模式

概念:
外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

  (1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。

  (2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

  (3).客户角色:通过调用Facede来完成要实现的功能

 

桥接模式 

1.桥接模式的优点

(1)实现了抽象和实现部分的分离

桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。

(2)更好的可扩展性

由于桥接模式把抽象部分和实现部分分离了,从而分别定义接口,这就使得抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性。

(3)可动态的切换实现

由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

(4)实现细节对客户端透明,可以对用户隐藏实现细节。

2.桥接模式的缺点

(1)桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

(2)桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

3.桥接模式的使用场景

(1)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

(2)抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。

(3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

(4)虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。

(5)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用

 

组合模式

2、角色组成

抽象构件角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。这个接口可 以用来管理所有的子对象。(可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。

树叶构件角色(Leaf):在组合树中表示叶节点对象,叶节点没有子节点。并在组合中定义图元对象的行为。

树枝构件角色(Composite):定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。

客户角色(Client):通过component接口操纵组合部件的对象。

 

3、组合模式的优缺点

优点:

组合模式使得客户端代码可以一致地处理对象和对象容器,无需关系处理的单个对象,还是组合的对象容器。

将”客户代码与复杂的对象容器结构“解耦。

可以更容易地往组合对象中加入新的构件。

缺点: 使得设计更加复杂。客户端需要花更多时间理清类之间的层次关系。(这个是几乎所有设计模式所面临的问题)。

注意的问题:

有时候系统需要遍历一个树枝结构的子构件很多次,这时候可以考虑把遍历子构件的结构存储在父构件里面作为缓存。

客户端尽量不要直接调用树叶类中的方法(在我上面实现就是这样的,创建的是一个树枝的具体对象;),而是借用其父类(Graphics)的多态性完成调用,这样可以增加代码的复用性。

4、组合模式的使用场景

在以下情况下应该考虑使用组合模式:

当想表达对象的部分-整体的层次结构时。

希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。

 

 

享元模式 

享元模式:以共享的方式高效的支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。

java的 String 类型就是享元模式

 

单纯享元模式所涉及到的角色如下:

   抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

   具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

   享元工厂(FlyweightFactory)角色 :本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。

复合享元角色所涉及到的角色如下:

   抽象享元(Flyweight)角色 :给出一个抽象接口,以规定出所有具体享元角色需要实现的方法。

   具体享元(ConcreteFlyweight)角色:实现抽象享元角色所规定出的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。

     复合享元(ConcreteCompositeFlyweight)角色 :复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称作不可共享的享元对象。

      享元工厂(FlyweightFactory)角色 :本角 色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有 一个符合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享元工厂角色就应当创建一个 合适的享元对象。

享元模式的优缺点

  享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:

   享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

   享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

 

享元模式使用的场景:

当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。

 

posted @ 2021-02-19 20:01  本性使然  阅读(124)  评论(0编辑  收藏  举报