设计模式——类图以及类与类之间的关系

设计模式——类图以及类与类之间的关系

设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。

一、用UML表示一个类

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


类图一般是三行的结构:

  1. 类名称
  2. 属性:格式(可见性 名称:类型[=缺省值])
  3. 方法:格式(可见性 名称(参数列表)[返回类型]) 注:在 Visio 中的画的类图中使用的是 C# 的数据类型,与 Java 的略有差别。

二、类与类之间的关系

类与类之间主要有6种关系,包括依赖,关联,聚合,组合,继承,实现。他们的耦合度是一次增强的。

1、依赖(Dependency)

依赖主要体现了一种使用关系,两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,主要体现为依赖关系。

依赖关系主要有3种表现形式:(以类A中使用了类B为例)

  1. 类B是作为类A的方法参数
  2. 类B是类A的方法中的局部变量
  3. 在类A中调用类B的静态方法
www.zeeklog.com  - 设计模式——类图以及类与类之间的关系

在依赖中使用的是“虚线+箭头”。

public class Student {
	public void read(Book book){
		System.out.println("读的书是:" + book.getName());
	}
	
	public void eat(Food food){
		System.out.println("吃的是:" + food.getName());
	}
}



2、关联(Association)

关联主要体现的是一种对应关系,两个相对独立的对象,当一个对象的实例与另一个对象的实例存在固定的对应关系时,这两个对象之间为关联关系。通常是将一个类的对象作为另一个类的成员变量。

关联关系的分类:

  1. 单向关联
  2. 双向关联
www.zeeklog.com  - 设计模式——类图以及类与类之间的关系

(单向关联)

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


(双向关联)

public class Student{
	private String id;
	private ClassName className;

	public Student(String id){
		this.id = id;
		this.className = new ClassName();
	}
}



3、聚合(Aggregation)

聚合是关联关系的一种,表现了一种弱的“拥有”关系,关联关系的对象之间是相互独立的,但是聚合关系的对象之间存在着一种包容关系,体现的是A对象可以包容B对象,但是B对象不是A对象的一部分。他们之间是“整体-个体”的关系。

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中。

public class People{
	private Student student;
	private Worker worker;
	private Farmer farmer;

	public People(Student student, Worker worker, Farmer farmer){
		this.student = student;
		this.worker = worker;
		this.farmer = farmer;
	}
}



4、组合(Composition)

组合是一种强的“拥有”关系,组合中的类之间是“整体-部分”的关系,“整体”负责“部分”的生命周期,“部分”和“整体”的生命周期是一样的,“部分”单独存在是没有任何意义的。通常在整体类的构造方法中直接实例化成员类。

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


public class Bird{
	private Wing wing;

	public People(){
		wing = new Wing();
}



5、继承(Generalization)

继承表示的是类与类之间或者接口与接口之间的父子关系,在java中使用的是extends关键字。

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


public class Bird extends Animal{
	
}



6、实现(Implementation)

实现表示的是一个类实现一个或者多个接口,在java中使用的是implements关键字。

www.zeeklog.com  - 设计模式——类图以及类与类之间的关系


public class Bird implements Animal{
	
}




参考文献

  1. 深入浅出UML类图(http://www.uml.org.cn/oobject/201211231.asp)
  2. 设计模式中类的关系(http://blog.csdn.net/zhengzhb/article/details/7187278)

Read more

科普文:Java基础系列之【线程间共享变量volatile】

科普文:Java基础系列之【线程间共享变量volatile】

概叙 volatile 最适用的场景:一个线程写,多个线程读。 JMM(Java内存模型)特征 1.原子性: 原子性是指多线程一起执行时,一个线程操作开始后不会被其他线程干扰,操作不可被中断; * synchronizd临界区执行具有原子性; * volatile仅仅保证对单个volatile变量的操作具有原子性; 2.可见性: 一个线程修改共享变量时,其他线程能够立即知道这个修改; * 单线程:不存在内存可见性问题; * 多线程:Java通过volatile, synchronized, final关键字实现可见性; * volatile:valatile变量保证变量新值立即被同步回主存,每次读取valtile变量都立即从主存刷新; * synchronized:对变量进行解锁前,将对应变量同步回内存; * final:final字段一旦初始化完毕,并且this引用没有发生逃逸,其他线程立即看到final字段值; 3.有序性: 线程内操作有序进行,线程间操作有序进行; * Java通过volatile, synchronized保证线程间操作的

By Ne0inhk
科普文:Java基础系列之【万字详解Java线程原理及其核心方法】

科普文:Java基础系列之【万字详解Java线程原理及其核心方法】

1.进程和线程 进程:进程的本质是一个正在执行的程序,程序运行时系统会创建一个进程,并且给每个进程分配独立的内存地址空间保证每个进程地址不会相互干扰。同时,在 CPU 对进程做时间片的切换时,保证进程切换过程中仍然要从进程切换之前运行的位置出开始执行。所以进程通常还会包括程序计数器、堆栈指针。 线程:有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派 CPU 的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 程序、进程、线程之间的关系: * 程序指的是以文件形式存储在磁盘上的计算机指令的集合。程序=算法+数据结构 * 进程指的是一个执行中的程序,每一个进程拥有独立的内存空间和系统资源。 * 线程是CPU调度的最小单元,它运行在进程中,不能独立存在。 2.系统线程模型 操作系统中关键概念: * 内核线程KLT:内核级线程(Kemel-Level Threads)

By Ne0inhk
科普文:Java基础系列之【JNI-从jvm源码分析Thread.start的调用与Thread.run的回调 】

科普文:Java基础系列之【JNI-从jvm源码分析Thread.start的调用与Thread.run的回调 】

前言 在java编程中,线程Thread是我们经常使用的类。那么创建一个Thread的本质究竟是什么,本文就此问题作一个探索。 前面文章,我们详细描述了java线程,以及线程间数据共享;同时也分析了线程start方法为啥只能被调用一次,并且通过修改线程状态,让其支持多次调用start。 今天我们继续讲解start,以及start如何回调run。 内容主要分为以下几个部分 1.JNI机制的使用 2.Thread创建线程的底层调用分析 3.系统线程的使用 4.Thread中run方法的回调分析 5.实现一个jni的回调 1.JNI机制的基本使用 当我们new出一个Thread的时候,仅仅是创建了一个java层面的线程对象,而只有当Thread的start方法被调用的时候,一个线程才真正开始执行了。所以start方法是我们关注的目标 查看Thread类的start方法 public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateE

By Ne0inhk
科普文:Java基础系列之【JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理】

科普文:Java基础系列之【JNI-从jvm源码分析Thread.interrupt的系统级别线程打断原理】

前言 在java编程中,我们经常会调用Thread.sleep()方法使得线程停止运行一段时间,而Thread类中也提供了interrupt方法供我们去主动打断一个线程。那么线程挂起和打断的本质究竟是什么,本文就此问题作一个探究。 本文主要分为以下几个部分 1.interrupt的使用特点 2.jvm层面上interrupt方法的本质 3.ParkEvent对象的本质 4.Park()对象的本质 5.利用jni实现一个可以被打断的MyThread类 1.interrupt的使用特点 我们先看2个线程打断的示例 首先是可打断的情况: @Test public void interruptedTest() throws InterruptedException { Thread sleep = new Thread(() -> { try { log.info("sleep thread start"); TimeUnit.SECONDS.sleep(1); log.in

By Ne0inhk