属性和方法前加上(+、-、#、留空)分别代表:公开(public)、私有(private)、保护(protected)、缺省(default)
方法括号内为参数类型,冒号后为返回值类型
下划线表示 静态(static),斜体表示 抽象(abstract)
其中 关联、聚合、组合,比较容易混淆,它们的区别:
关联:描述的是两个独立实体之间的连接,它们可以独立存在。
聚合:描述的是整体和部分之间的关系,部分可以独立于整体存在。
组合:描述的是一种更强的整体和部分关系,部分不能独立于整体存在。
依赖 和 关联 的主要区别在于:
依赖是临时性的,而关联是长期性的。
依赖关系通常表示一个类使用另一个类,而关联关系表示对象之间的结构关系。
对扩展开放,对修改关闭。
即程序要设计成扩展新功能时,只需添加新代码,而无需修改现有代码。
子类可以当作父类使用,且替换后不改变运行结果。
一个类只负责一个职责。
高层模块不应该依赖底层模块,抽象不应该依赖于细节。
接口应该小而完备,避免大而臃肿。不因该强迫实现类实现不该有的功能。
在代码复用时,优先使用组合、聚合、关联的方式,其次考虑继承方式。
组合、聚合、关联、继承的区别可参考上面《类图关系表示法》。
一个类对于其他类知道的越少越好。
要注意,下图是以类的角度。从方法的角度来看,方法之间互调频繁,也是耦合。
缺点:类加载后立刻创建对象,较占资源。
优点:按需加载。
缺点:使用锁来保证并发安全,代码较复杂。
优点:懒汉式改进版,使用JVM机制取代了锁,同样能保证并发安全的情况下,代码更简单了。
优点:客户和具体商品解耦。
缺点:工厂里硬编码所有商品,每次添加新商品需要修改工厂代码,违反开闭原则。
特点:添加新商品只需新建对应工厂,无需修改其他代码,符合开闭原则。
特点:每个品牌工厂可以生产多种类型的商品。
定义:将一个对象的建造步骤、顺序、细节进行分离。
抽象建造者:定义构建产品的步骤。
具体建造者:实现每个步骤。
指挥者:决定步骤的执行顺序。
定义:通过代理类来访问被代理类。
定义:将抽象与实现分离,使它们都可以独立地变化。
定义:通过包装,让类兼容特定接口。
定义:通过包装,实现功能动态扩展。
定义:对象可以被订阅,并主动通知订阅者。
定义:使策略能动态的切换。
定义:将可变的方法延迟到子类实现。
定义:把类功能按不同状态进行分离。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
定义:多个处理者按序连接,每个处理者决定是否处理请求、是否调用后序。