UML类图

  • 第一行:类名称
  • 第二行:特性(字段或属性)
  • 第三行:操作(方法或行为)
补充:
  • 类名称如果是斜体字,说明此类是抽象类;
  • ‘+’表示public、“-”表示private、‘#’表示protected

类与类、类与接口之间的关系

  • 继承关系:空心三角形+实线来表示
  • 实现接口:空心三角形+虚线来表示
  • 关联关系(例如:一个类中引用到另一个类的对象的时候):实线箭头来表示
  • 依赖关系(例如:一个类在构造函数里面需要另一个类的对象的时候):虚线箭头来表示
  • 聚合关系(例如:雁群对象包含大雁,但是大雁不是雁群的一部分):空菱形+实线箭头
  • 组合关系(例如:小鸟与翅膀,是整体与部分的关系并且翅膀与小鸟的生命周期是相同的):实心菱形+实线箭头

常见的原则

单一职责原则:

  • 就一个类而言,应该仅有一个引用它变化的原因;也就是单一功能对象不能承担太多的职责
例如:这个接口功能太多;应该将登录、注册放到一个接口、打印日志方法放到一个接口、发送邮件方法放到一个接口。
public interface UserService {
    
    public void login(String username, String password);
    public void register(String email, String username, String password);
    public void logError(String msg);
    public void sendEmail(String email);
    
}

开放-封闭原则(OCP):

  • 软件实体(类、模块、函数)应该可以拓展,但是不可以修改
  • 例如:策略模式:增添一个具体的策略,只需要实现对应的接口即可,而不是在已有的策略上进行修改。

依赖倒置原则:

  • 抽象不应该依赖细节,细节应该依赖于抽象;
  • 高层模块不应该依赖底层模块。两个都应该依赖抽象;
  • 也就是要针对接口设计,不要针对实现编程。

里氏代换原则:

  • 子类型必须能够替换掉他们的父类型;
  • 子类型重写父类型的方法,可以在不更改父类的情况下,实现对功能的拓展。

迪米特原则:

  • 如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。