结构型设计模式:关注类或者类与对象之间的组合关系,以构建更加复杂的系统
 package me.maxiaolong.designpattern;
 /**
  * @author maxiaolong
  * created at 2020/7/4
  * 结构型设计模式:关注类或类与对象之间的组合以构成更加复杂的系统
  * 1. 类结构型设计模式:关注类之间的组合,类之间的组合一般只存在继承关系和实现关系
  * 2. 对象结构型设计模式:关注类与对象之间的组合,类与对象之间的关联可以使用组合和聚合,满足合成复用原则(大部分结构型设计模式为对象结构型设计模式)
  *
  * 适配器设计模式(Adapter/Wrapper)主要是将一个类的接口转换为用户希望的另一接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
  */
 
 public class ClassAdapterClient {
     public static void main(String[] args) {
         Target target = new Adapter();
         target.request();
     }
 }
 
 class Adaptee{
     public void specialRequest(){
         System.out.println("special request");
     }
 }
 
 interface Target{
     /**
      * 客户端目标类所期望的请求方法
      */
     void request();
 }
 
 class Adapter extends Adaptee implements Target{
 
     @Override
     public void request() {
         specialRequest();
     }
 }
* 对象适配器
  ```java
  package me.maxiaolong.designpattern;
  /**
   * @author maxiaolong
   * created at 2020/7/4
   */
  public class ObjectAdapterClient {
      public static void main(String[] args) {
          Target1 target1 = new Adapter1();
          target1.request();
      }
  }
  
  abstract class Target1{
      public abstract void request();
  }
  
  class Adaptee1{
      public void specialRequest(){
          System.out.println("special request");
      }
  }
  
  class Adapter1 extends Target1{
      private Adaptee1 adaptee1 = new Adaptee1();
  
      @Override
      public void request() {
          adaptee1.specialRequest();
      }
  }
  ```
```java
package me.maxiaolong.designpattern;
/**
 * @author maxiaolong
 * created at 2020/7/4
 * 装饰模式是一种替换继承的技术,他通过一种无序定义子类的方式给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系(聚合)
 */
public class DecoratorClient {
    public static void main(String[] args) {
        //创建对象
        Component concreteComponent = new ConcreteComponent();
        Decorator concreteDecorator = new ConcreteDecorator2(concreteComponent);
        //same method, add additional method
        concreteDecorator.operation();
    }
}
abstract class Component{
    public abstract void operation();
}
class ConcreteComponent extends Component{
    @Override
    public void operation() {
        System.out.println("concrete component operation");
    }
}
class Decorator extends Component{
    private Component component;
    public  Decorator(Component component){
        this.component = component;
    }
    public Component getComponent() {
        return component;
    }
    public void setComponent(Component component) {
        this.component = component;
    }
    @Override
    public void operation() {
        component.operation();
    }
}
class ConcreteDecorator1 extends Decorator{
    private int addedState;
    public ConcreteDecorator1(Component component) {
        super(component);
    }
}
class ConcreteDecorator2 extends Decorator{
    public ConcreteDecorator2(Component component) {
        super(component);
    }
    @Override
    public void operation() {
        getComponent().operation();
        addedBehavior();
    }
    public void addedBehavior(){
        System.out.println("add behavior");
    }
}
```
```java
package me.maxiaolong.designpattern;
/**
 * @author maxiaolong
 * created at 2020/7/4
 * 代理模式:当直接访问某些对象存在问题是可以通过一个代理对象间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象都要实现相同的接口(组合)
 * 使用组合的方式(且使用的是真实对象作为类的声明,设置为私有),代理类与真实类需要实现同样的接口,客户端应该完全无法接触真实客体
 */
public class ProxyClient {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.request();
    }
}
abstract class Subject{
    public abstract void request();
}
class RealSubject extends Subject{
    @Override
    public void request() {
        System.out.println("real subject");
    }
}
class Proxy extends Subject{
    /**
     * 一定要使用真实对象
     */
    private RealSubject realSubject = new RealSubject();
    @Override
    public void request() {
        beforeRequest();
        realSubject.request();
        afterRequest();
    }
    public void beforeRequest(){
        System.out.println("before proxy");
    }
    public void afterRequest(){
        System.out.println("after proxy");
    }
}
```原文:https://www.cnblogs.com/mrdragonma/p/13253914.html