您的位置:首页 > 编程语言 > Java开发

JAVA模式(持续更新)

2017-07-19 09:38 281 查看

1、UML包含几种类图

1、结构型图:类图、构件图、部署图

2、行为型图:使用案例图、时序图、状态图、合作图、活动图

3、类图结构:自上至下包含类名、属性、方法以及性质

类名:正体字为具体类,斜体字为抽象类,加盖Interface标识为接口

属性:+表示public;-表示为private;#表示为protected

方法:+表示public;-表示为private;#表示为protected;加下划线为静态方法

性质层:由一个属性、取值函数和赋值函数组成

1)类图。类图描述一组类、接口、协作和它们之间的关系。在OO系统建模中,最常见的图就是类图。类图给出了系统的静态设计视图,活动类的类图给出了系统的静态进程视图。

2)对象图。对象图描述一组对象及它们之间的关系。对象图描述了在类图中所建立的事物实例的静态快照。和类图一样,这些图给出系统的静态设计视图或静态进程视图,但它们是从真实实例或原型案例的角度建立的

3)构件图。构件图描述一个封装的类和它的接口、端口,以及由内嵌的构建和连接件构成的内部结构。构件图用于表示系统的静态设计实现视图。对于由小的部件构建大的系统来说,构件图是很重要的。构建图是类图的变体

4)组合结构图。组合结构图描述结构化类(如构件或类)的内部结构,包括结构化类与系统其余部分的交互点。组合结构图用于画出结构化类的内部内容

5)用例图。用例图描述一组用例、参与者及它们之间的关系。用例图给出系统的静态用例视图。这些图在对系统的行为进行组织和建模时是非常重要的。

6)顺序图。顺序图是一种交互图,交互图展现了一种交互,由一组对象或参与者以及它们之间可能发送的消息构成。交互图专注预提性的动态视图。顺序图是强调消息的时间次序的交互图。

7)通信图。通信图也是一种交互图,强调收发消息的对象或参与者的结构组织,该图反应了对象之间的消息交互,于顺序图想死,但与顺序图不同的是,协作图不但描述了对象之间的交互还描述了交互对象之间的链接关系。即通信图同时反映了系统的动态和静态特征。通信图成为协作图。

8)定时图。定时图也是一种交互图,强调消息跨越不同对象或参与者的实际时间,而不仅仅只是关心消息的相对顺序。

9)状态图。状态图描述一个状态机,由状态、转移、时间和活动组成。状态图给出了对象的动态视图。它对于接口、类或协作的行为建模尤为重要,而且它强调事件导致的对象行为,有助于对反应式系统建模。

10)活动图。活动图将进程或其他计算结构展示为计算内部一步步的控制流和数据流。活动图专注于系统的动态视图。它对系统的功能建模和业务流程建模特别重要,并强调对象间的控制流程。

11)部署图。部署图描述对运行时的处理节点及在其中生存构建的配置。部署图给出了架构的静态部署视图,通常一个节点包含一个或多个部署图。

12)制品图。制品图描述计算机中的一个系统的物理结构。制品包括文件、数据库和类似物理比特集合。制品图通常与部署图一起使用。制品也给出了他们实现的类和构建

13)包图。包图描述由模型本身分解而成的组织单元,以及他们之间的依赖关系。

14)交互概览图。交互概览图是活动图和顺序图的混合物。

其中结构性视图包括类图、对象图、包图、组合结构图、构件图、部署图和制品图,而行为性视图包括用例图、顺序图、通信图、定时图、状态图、活动图、交互概览图。其中顺序图、通信图、定时图和交互该蓝图统称为交互图。

2、类图之间的关系

1、一般化关系:主要表示类与类的继承、接口与接口之间的继承、以及类与接口之间的实现;

2、关联关系:是类与类之间的联接,它使一个类知道另一个类的属性和方法;分为单向关联与双向关联;单向关联由实线一个箭头组成,箭头表示关联方向;双向关联由双箭头或者无箭头来表示,不过大部分为单向关联;例如:

public class drive{
private Car car //UML 用 -car :Car来表示
}


3、聚合关系:是关联关系的一种是强的关联关系。聚合是整体与个体之间的关系。例如汽车类与引擎类、论坛类;

由空三角、实线、以及箭头组成。通过实例变量来实现两者的聚合关系。例如:

public class Car{
private Engine engine;
private Tire[] tires;
//UML图 表示方法为
//- engine:Engine
//- tires:Tire[]
}


4、合成关系:也是关联关系的一种,是比聚合关系强的关系。由实心三角、实线和箭头来表示。例如 Person与limb之间的关系

public class Person{
private Limb limb;
//UML表示为:-limb:Limb
}


5、依赖关系:依赖也是类与类之间的连接,依赖总是单向的,无双向依赖关系。由虚线、箭头来组成,箭头表示依赖方向。例如:

public class Person{
public void buy(Car car){
car.method();
}
//+buy:void ------->Car
public String buy(House house){
return house.method();
}
}
// +buy:String ----->House


3.PLANTUML类图应用

3.1. 类图关系

♦ 泛化:属于继承关系;符号: - -|> 表现形式: 实线+实心三角

♦实现: 接口实现关系;符号: . .|> 表现形式:虚线+空三角

♦关联: 类之间引用关系关系表示类与类之间的连接,它使得一个类知道另外一个类的属性和方法。符号:*.. 例如 类A 类B public B someTing(){ return B} ;表现形式:0.. 虚线

♦聚合:类之间整体与局部的关系 强于关联,但在代码层面聚合与关联是一致的,只能从语义上来区分。:符号:o– 空四边形+实线+箭头

&diams:组合:比聚合更强,是一种强聚合关系。它同样体现整体与部分的关系,但此时整体与部分是不可分的,整体生命周期的结束也意味着部分生命周期的结束体现在代码层面与关联时一致的,只能从语义来区分。符号:*– 实心四边形+实线+箭头

&diams:依赖:表示类与类之间的连接,表示一个类依赖于另外一个类的定义,依赖关系时是单向的。简单理解就是类A使用到了类B,这种依赖具有偶然性、临时性,是非常弱的关系。符号–>: 表现形式:实线+箭头

3.2 PLANTUML类图注意细节

3.2.1 类之间 方向控制

–up–>,–down–>,–left–>,–right–>,

3.2.2 类之间说明

Class A –|> Class B: 类之间说明

3.2.3 类下方法说明与静态 抽象方法与类



Class A{
{static/abstract} Object function{}
}--> 在实际测试的时候,此处大括号 调整到与A 同一行才可,否则报错 no Package or namespace definded


♦ 抽象类 定义 abstract class A

&diams:接口定义: interface class A

3.2.4 注释,连接上的注释和隐藏字段

♦注释:note left of Class A:….;note right of …:”note somthing”; note up of… note down of …

♦ 连接上的注释:note on link #red: ‘note something’

♦ hide Class /hide functions

3.2.5 权限

♦-:private

♦~ package private

♦#:protected

♦+:public

4、java设计遵循的原则

1、开闭原则:一个软件实体应当对扩展开发,对修改关闭。用面向对象的语言来讲,不允许修改的是系统的抽象层,而允许扩展的是系统的实现层。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现。

2、里氏代换原则:是对开-闭原则的补充,也就是说任何基类可以出现的地方,子类一定可以实现。

3、接口隔离原则:应当为客户端几桶尽可能小的单独的接口,而不是提供大的总接口。

4、依赖倒转原则:要依赖于抽象,不能依赖于实现。

5、合成/聚合复用原则:要尽量使用合成/聚合关系,而不是继承关系达到复用的目的。合成/聚合复用原则是与里氏代换原则相辅相成的,两者都是对实现“开-闭原则”的具体步骤的规范,前者要求设计师首先考虑合成/聚合关系,后者要求在使用继承关系时,必须确定这个关系是符合一定条件的。

6、迪米特法则:一个软件实体应当与尽可能少的其他实体发生相互作用。

7、遵循接口隔离原则与迪米特法则,会使一个软件系统在功能扩展的过程当中,不会将修改的压力传递到其它对象中.

5、planUML与UML Support简介

  当然讨论java模式离不开UML设计,UML设计目前我使用PlantUML与IDEA集成,使用UML Support查看分析程序内各类的依赖.现在介绍一下 PlantUML插件绘制UML图.

  PlantUML目前是主流的UML绘制软件,可以较好的与各个IDE进行集成,主要使用以下几部分内容:

  ♦新建一个unititled Text File 输入语法为:

@startuml @enduml自动编译的开始和结束标志;例如:

package com.xu81.uml{
class TestA{
-String name
-int id
}
class TestB extends TestA{
-String desc
+String getDesc()
+void setDesc(String desc)
}
}//两者为继承:一般化关系


  ♦plantUml类图构建说明

  ♦package:包关键字

  ♦+表示方法或属性为public

  ♦-表示方法或属性为private

  ♦没有括号表示为属性

  ♦有括号表示为方法

  ♦extends:继承关键字也可以用符号: –|>

  ♦顺序图用->,–><-,<–来绘制参与者之间的消息.

5.JAVA模式

5.1 简单工厂模式

简单工程模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例.简单模式涉及到工厂角色/抽象产品角色以及具体产品角色等三个角色.

- 工厂类角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑.工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现.

- 抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或他们共同拥有的接口.抽象产品角色可以用一个java接口或者java抽象类实现

- 具体产品角色:工厂方法模式所创建的额任何对象都是这个角色的实例,具体产品角色由一个具体java类实现.

5.2 工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象和推广;在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做,这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口.

工厂方法模式的系统涉及到以下角色:

- 抽象工厂角色

- 具体工厂角色

- 抽象产品角色

- 具体产品角色

5.3 单例模式与多例模式

5.3.1 单例模式特点

1.单例类只能有一个实例

2.单例类必须自己创建自己的实例

3.单例类可以给所有对象提供这一实例

- 饿汉式单例类

public class EageSinleton{
private static final EageSinleton m_instance=new EageSinleton();
//私有构造化方法
private EageSinleton(){}
//静态化工厂方法
public static EageSinleton getInstance(){
return m_instance;
}
}


懒汉式单例类

public class EageSinleton{
private static final EageSinleton m_instance=null;
//私有构造化方法
private EageSinleton(){}
//静态化工厂方法
synchronized public static EageSinleton getInstance(){
if(m_instance==null){
m_instance=new EageSinleton();
}
return m_instance;
}
}


有状态单例类:有状态的可变的单例对象常常当做状态库使用,比如一个单例对象可以持有一个int类型的属性,用来给一个系统提供一个数值唯一的序列号码

无状态单例类:没有状态的单例类仅用作提供工具性函数的对象。

5.3.2 多例模式特点

多例类可有多个实例;

多例类必须自己创建.管理自己的实例,并像外界提供自己的实例

5.4 建造模式

建造模式涉及到四个角色:

抽象建造者角色:给出一个抽象接口

具体建造者角色:担任这个角色的是与应用程序紧密相关的一些类,他们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:实现抽象建造者Builder所声明的接口,给出一步一步完成创建产品实例的操作。

建造过程完成后,提供产品的实例

导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者角色并没有产品类的具体指示,真正拥有产品类的具体知识的是具体建造者角色

产品角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多余一个产品的产品类,而且这些产品类并不一定有共同的接口

5.5 原始模式

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uml 架构模式