赞
踩
UML提供的通用机制为模型元素提供额外的注释、语义和其他信息,包括扩展机制,允许用户对UML进行扩展
在UML类图中,类一般由三部分组成:
第一部分是类名:每个类都必须有一个名字,类名是一个字符串
第二部分是类的属性(Attributes):属性是指类的性质,即类的成员变量。一个类可以有任意多个属性,也可以没有属性
第三部分是类的操作(Operations):操作是类的任意一个实例对象都拥有的行为,是类的成员方法
关联(Association)关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系
在UML类图中,用实线连接有关联关系的对象所对应的类,在使用Java、C++和C#等编程语言实现关联关系时,通常将一个类的对象作为另一个类的成员变量
在使用类图表示关联关系时可以在关联线上标注角色名
public class Customer {
private Address address;
……
}
public class Address {
……
}
public class Customer {
private Product[] products;
……
}
public class Product{
private Customer customer;
……
}
public class Node {
private Node subNode;
……
}
多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示
public class Form {
private Button[] buttons; //定义一个集合对象
……
}
public class Button {
…
}
public class Car {
private Engine engine;
public Car(Engine engine) { //构造注入
this.engine = engine;
}
public void setEngine(Engine engine) { //设值注入
this.engine = engine;
}
……
}
public class Engine {
……
}
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //实例化成员类
}
……
}
public class Mouth {
……
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FPtRhEH-1610718893316)(http://img.mini.hutang.site/mweb/15771511465403.jpg)]
public class Driver {
public void drive(Car car)
{
car.move();
}
……
}
public class Car {
public void move() {
......
}
……
}
//父类 public class Person { protected String name; protected int age; public void move() { …… } public void say() { …… } } //子类 public class Student extends Person { private String studentNo; public void study() { …… } }
public interface Vehicle {
public void move();
}
public class Ship implements Vehicle {
public void move() {
……
}
}
public class Car implements Vehicle {
public void move() {
……
}
}
单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。
Single Responsibility Principle (SRP): Every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.
开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则
开闭原则:软件实体应当对扩展开放,对修改关闭。
Open-Closed Principle (OCP): Software entities should be open for extension, but closed for modification.
里氏代换原则:所有引用基类的地方必须能透明地使用其子类的对象。
Liskov Substitution Principle (LSP): Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
某系统需要实现对重要数据(如用户密码)的加密处理,在数据操作类(DataOperator)中需要调用加密类中定义的加密算法,系统提供了两个不同的加密类,CipherA和CipherB,它们实现不同的加密方法,在DataOperator中可以选择其中的一个实现加密操作。如图所示:
如果需要更换一个加密算法类或者增加并使用一个新的加密算法类,如将CipherA改为CipherB,则需要修改客户类Client和数据操作类DataOperator的源代码,违背了开闭原则。
现使用里氏代换原则对其进行重构,使得系统可以灵活扩展,符合开闭原则。
依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。
Dependency Inversion Principle (DIP): High level modules should not depend upon low level modules, both should depend upon abstractions. Abstractions should not depend upon details, details should depend upon abstractions.
要针对接口编程,不要针对实现编程
Program to an interface, not an implementation.
某系统提供一个数据转换模块,可以将来自不同数据源的数据转换成多种格式,如可以转换来自数据库的数据(DatabaseSource)、也可以转换来自文本文件的数据(TextSource),转换后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer)等。
由于需求的变化,该系统可能需要增加新的数据源或者新的文件格式,每增加一个新的类型的数据源或者新的类型的文件格式,客户类MainClass都需要修改源代码,以便使用新的类,但违背了开闭原则。现使用依赖倒转原则对其进行重构。
接口隔离原则:客户端不应该依赖那些它不需要的接口。
Interface Segregation Principle (ISP): Clients should not be forced to depend upon interfaces that they do not use.
下图展示了一个拥有多个客户类的系统,在系统中定义了一个巨大的接口(胖接口)AbstractService来服务所有的客户类。可以使用接口隔离原则对其进行重构
合成复用原则又称为组合/聚合复用原则(Composition/ Aggregate Reuse Principle, CARP)
合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。
Composite Reuse Principle (CRP):Favor composition of objects over inheritance as a reuse mechanism.
某教学管理系统部分数据库访问类设计如图所示:
如果需要更换数据库连接方式,如原来采用JDBC连接数据库,现在采用数据库连接池连接,则需要修改DBUtil类源代码。如果StudentDAO采用JDBC连接,但是TeacherDAO采用连接池连接,则需要增加一个新的DBUtil类,并修改StudentDAO或TeacherDAO的源代码,使之继承新的数据库连接类,这将违背开闭原则,系统扩展性较差。
现使用合成复用原则对其进行重构。
迪米特法则又称为最少知识原则(Least Knowledge Principle, LKP)
迪米特法则:每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
Law of Demeter (LoD): Each unit should have only limited knowledge about other units: only units “closely” related to the current unit.
某系统界面类(如Form1、Form2等类)与数据访问类(如DAO1、DAO2等类)之间的调用关系较为复杂,如图所示:
软件模式:在一定条件下的软件开发问题及其解法
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性
设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。