设计模式

113 阅读3分钟

UML类图

继承(Extends)

使用空心箭头表示 image-20211006174405751.png

实现(Implementation)

实现关系用一条带空心箭头的虚线表示

image-20211006174527928.png

聚合(aggregation)

聚合关系用一条带空心菱形箭头的直线表示A由B组成

image-20211006173206533.png

组合(composition)

组合关系用一条带实心菱形箭头直线表示 image-20211006173726833.png

关联(association)

关联关系是用一条直线表示,A知道B,B不知道A

image-20211006161611573.png

依赖(dependency)

image-20211006161611573.png

依赖关系用一套带箭头的虚线表示

结构型模式

结构型模式描述如何将类或对象结合一起形成更大的结构,结构型模式可以分为类结构型模式和对象型模式

类结构型模式一般只存在于继承和实现关系中,对象结构型模式关心类或对象的组合,通过关联关系使得在一个类中定义另一个类的实例对象,然后通过该对象调用其方法。

装饰器模式(Decorator)

定义

动态地给一个对象增加一些额外的职责,给一个类或对象增加行为

image-20211007152757141.png 装饰器模式组成:

  1. 抽象组件角色(Component): 定义可以动态添加任务的对象的接口
  2. 具体组件角色(ConcreteComponent):定义一个要被装饰器装饰的对象,即 Component 的具体实现
  3. 抽象装饰器(Decorator): 维护对组件对象和其子类组件的引用
  4. 具体装饰器角色(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图

image-20211007191416872.png

  • 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中的拦截器