UML类图
继承(Extends)
使用空心箭头表示
实现(Implementation)
实现关系用一条带空心箭头的虚线表示
聚合(aggregation)
聚合关系用一条带空心菱形箭头的直线表示A由B组成
组合(composition)
组合关系用一条带实心菱形箭头直线表示
关联(association)
关联关系是用一条直线表示,A知道B,B不知道A
依赖(dependency)
依赖关系用一套带箭头的虚线表示
结构型模式
结构型模式描述如何将类或对象结合一起形成更大的结构,结构型模式可以分为类结构型模式和对象型模式
类结构型模式一般只存在于继承和实现关系中,对象结构型模式关心类或对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。
装饰器模式(Decorator)
定义
动态地给一个对象增加一些额外的职责,给一个类或对象增加行为
装饰器模式组成:
- 抽象组件角色(Component): 定义可以动态添加任务的对象的接口
- 具体组件角色(ConcreteComponent):定义一个要被装饰器装饰的对象,即 Component 的具体实现
- 抽象装饰器(Decorator): 维护对组件对象和其子类组件的引用
- 具体装饰器角色(ConcreteDecorator):向组件添加新的职责
代码
public interface Compoment {
public void operation();
}
public class ConcreteCompoment implements Compoment{
@Override
public void operation() {
System.out.println("实体类");
}
}
public abstract class Decorator implements Compoment{
private Compoment compoment;
public Decorator(Compoment compoment) {
this.compoment = compoment;
}
@Override
public void operation() {
compoment.operation();
}
}
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Compoment compoment) {
super(compoment);
}
public void addOperation(){
super.operation();
System.out.println("添加功能");
}
}
public class Test {
public static void main(String[] args) {
ConcreteCompoment concreteCompoment = new ConcreteCompoment();
ConcreteDecorator concreteDecorator = new ConcreteDecorator(concreteCompoment);
concreteDecorator.addOperation();
}
}
使用场景
Mybatis 二级缓存,IO类
优点
- 与继承关系相比,关联关系的主要优势在于不会破坏类的封装,同时降低代码的耦合度,使得系统更加容易维护,缺点是需要比继承创建更多的对象。
- 使用装饰器模式来实现比继承更加灵活,不需要创造更多子类的情况下,将对象的功能加以扩展。
行为型模式
责任链模式
定义
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到有某个接收对象能够处理这个请求为止。
UML图
- Client:
- Handle: 提供给实际处理器继承并实现handleRequest方法
- ConcreteHandler: 具体处理器
代码
public abstract class Handler {
protected Handler handler;
public void setHandler(Handler handler){
this.handler = handler;
}
public abstract void requestHandle(int requestId);
}
public class ConcreteHandlerA extends Handler {
@Override
public void requestHandle(int requestId) {
if(requestId == 1){
System.out.println("第一次处理");
}
//当前处理器接收不了当前请求,交由链中的下一个处理进行处理
super.handler.requestHandle(requestId);
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void requestHandle(int requestId) {
System.out.println("第二次处理");
}
}
public class Test {
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
//由对象串成一条链
handlerA.setHandler(handlerB);
handlerA.requestHandle(2);
}
}
优点
应用
Spring中的拦截器