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("-------------------------------------------");
    }
}

测试结果

原始装配。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
-------------------------------------------
原始装配。。。。。。
打领带。。。。。。
-------------------------------------------
原始装配。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
戴手表。。。。。。
-------------------------------------------
原始装配。。。。。。
戴帽子。。。。。。
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
-------------------------------------------
原始装配。。。。。。
穿西装。。。。。。
打领带。。。。。。
穿皮鞋......
戴手表。。。。。。
戴帽子。。。。。。
-------------------------------------------
0%