Java设计模式-装饰器模式
          目录
          
        
        
      装饰器模式
**定义:**装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案
装饰器模式中的角色
- 抽象组件(Component):定义一个接口,已规范准备接收附加责任的对象
- 基体构件(ConcreteComponent):定义一个将要接收附加责任的类(被修饰则)他要实现抽象组件接口
- 装饰器(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
- **具体装饰(ConcreteDecorator)角色:**负责给构件对象“贴上”附加的责任
看上面的定义很抽象,很难懂,直接用案例上代码
业务场景
人,可以穿西装,打领带,穿皮鞋,戴手表,戴帽子等等一些列装饰行为。可以将人作为被修饰则,穿西装,打领带,穿皮鞋,戴手表,戴帽子则为附加的条件
定义一个组件接口
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public interface PeopleComponent {
    /**
     * 装饰行为
     */
    void method();
}定义一个被修饰则
package com.example.spring.boot.test.decorator.base;
import com.example.spring.boot.test.decorator.PeopleComponent;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class People implements PeopleComponent {
    @Override
    public void method() {
        System.out.println("原始装配。。。。。。");
    }
}定义装饰器抽象类
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public abstract class AbstractPeopleDecorator implements PeopleComponent{
    private final PeopleComponent peopleComponent;
    public AbstractPeopleDecorator(PeopleComponent peopleComponent) {
        this.peopleComponent = peopleComponent;
    }
    @Override
    public void method() {
        peopleComponent.method();
    }
}组件实现类(穿西装,打领带,穿皮鞋,戴手表,戴帽子)
穿西装
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class WearSuitPeopleDecorator extends AbstractPeopleDecorator{
    public WearSuitPeopleDecorator(PeopleComponent peopleComponent) {
        super(peopleComponent);
    }
    /**
     * 添加自己的行为
     */
    private void method1(){
        System.out.println("穿西装。。。。。。");
    }
    @Override
    public void method() {
        // 调用原始的业务逻辑
        super.method();
        // 新增加的功能
        this.method1();
    }
}打领带
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class TiePeopleDecorator extends AbstractPeopleDecorator{
    public TiePeopleDecorator(PeopleComponent peopleComponent) {
        super(peopleComponent);
    }
    private void method1(){
        System.out.println("打领带。。。。。。");
    }
    @Override
    public void method() {
        super.method();
        this.method1();
    }
}穿皮鞋
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class WearLeatherShoesPeopleDecorator extends AbstractPeopleDecorator{
    public WearLeatherShoesPeopleDecorator(PeopleComponent peopleComponent) {
        super(peopleComponent);
    }
    private void method1(){
        System.out.println("穿皮鞋......");
    }
    @Override
    public void method() {
        super.method();
        this.method1();
    }
}戴手表
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class WearWatchPeopleDecorator extends AbstractPeopleDecorator{
    public WearWatchPeopleDecorator(PeopleComponent peopleComponent) {
        super(peopleComponent);
    }
    private void method1(){
        System.out.println("戴手表。。。。。。");
    }
    @Override
    public void method() {
        super.method();
        this.method1();
    }
}戴帽子
package com.example.spring.boot.test.decorator;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class WearHatPeopleDecorator extends AbstractPeopleDecorator{
    public WearHatPeopleDecorator(PeopleComponent peopleComponent) {
        super(peopleComponent);
    }
    private void method1(){
        System.out.println("戴帽子。。。。。。");
    }
    @Override
    public void method() {
        super.method();
        this.method1();
    }
}测试
package com.example.spring.boot.test.decorator;
import com.example.spring.boot.test.decorator.base.People;
/**
 * @Description
 * @Author wuhuaming
 * @Date 2023/8/17
 */
public class TestDecorator {
    public static void main(String[] args) {
        // 被修饰则
        PeopleComponent component = new People();
        component.method();
        System.out.println("-------------------------------------------");
        // 穿西装
        PeopleComponent component1 = new WearSuitPeopleDecorator(component);
        component1.method();
        System.out.println("-------------------------------------------");
        // 打领带
        PeopleComponent component2 = new TiePeopleDecorator(component);
        component2.method();
        System.out.println("-------------------------------------------");
        // 穿皮鞋
        PeopleComponent component3 = new WearLeatherShoesPeopleDecorator(component);
        component3.method();
        System.out.println("-------------------------------------------");
        // 戴手表
        PeopleComponent component4 = new WearWatchPeopleDecorator(component);
        component4.method();
        System.out.println("-------------------------------------------");
        // 戴帽子
        PeopleComponent component5 = new WearHatPeopleDecorator(component);
        component5.method();
        System.out.println("-------------------------------------------");
        // 穿西装 + 打领带 + 穿皮鞋
        PeopleComponent component6 = new WearLeatherShoesPeopleDecorator(new TiePeopleDecorator(new WearSuitPeopleDecorator(component)));
        component6.method();
        System.out.println("-------------------------------------------");
        // 穿西装 + 打领带 + 穿皮鞋 + 戴手表 + 戴帽子
        PeopleComponent component7 = new WearHatPeopleDecorator(new WearWatchPeopleDecorator(component6));
        component7.method();
        System.out.println("-------------------------------------------");
    }
}测试结果
原始装配。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
-------------------------------------------
原始装配。。。。。。
打领带。。。。。。
-------------------------------------------
原始装配。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
戴手表。。。。。。
-------------------------------------------
原始装配。。。。。。
戴帽子。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
戴手表。。。。。。
戴帽子。。。。。。
-------------------------------------------