设计模式之装饰者模式

1.装饰者模式概念

允许在不修改原有类的情况下动态地为对象添加新的功能。它通过创建一个包装对象(即装饰器),并在运行时将这个包装对象附加到现有的对象上,从而达到扩展功能的目的。

2.装饰者的组成

1)抽象组件(Component)

抽象组件是一个接口或抽象类,定义了所有组件(包括具体组件和装饰器)的公共接口。

2)具体组件(Concrete Component)

具体组件实现了抽象组件接口中的方法,提供了基本的功能。

3)装饰器(Decorator)

装饰器也是一个接口或抽象类,继承自抽象组件接口。

4)具体装饰器(Concrete Decorator)

具体装饰器实现了装饰器接口中的方法,为被装饰的对象添加新的功能。

3.举个例子

想给自己的宠物狗(Concrete Component)穿衣服(Concrete Decorator)

想给自己的宠物狗(Concrete Component)穿衣服(Concrete Decorator)戴眼镜(Concrete Decorator)

如下图:

宠物猫===>衣服==》墨镜

4实现代码:

1)抽象组件

java 复制代码
package org.xiji.Decorator;

/**
 * 组件抽象类
 */
public interface Component {
    /**
     * 父组件操作
     */
    void introduce();
}

2)具体组件

java 复制代码
package org.xiji.Decorator;

public class Cat implements Component {
    @Override
    public void introduce() {
        System.out.println("这是一只猫");
    }
}

java 复制代码
package org.xiji.Decorator;

public class Dog implements Component{
    @Override
    public void introduce() {
        System.out.println("这是一只狗");
    }
}

3)装饰器

java 复制代码
package org.xiji.Decorator;

/**
 * 装饰器抽象类
 */
public abstract class Decorator implements Component{
    /**
     * 包含组件接口
     */
    Component component;
    public Decorator(Component component) {
        this.component = component;
    }

    /**
     * 调用父组件方法
     */
    @Override
    public void introduce() {
        component.introduce();
    }
}

4)具体装饰器

墨镜

java 复制代码
package org.xiji.Decorator;

/**
 * 墨镜
 */
public class Sunglasses extends Decorator{
    public Sunglasses(Component component) {
        super(component);
    }

    @Override
    public void introduce() {
        super.introduce();
        this.wearSunglasses();
    }

    public void wearSunglasses()
    {
        System.out.println("带墨镜");
    }
}

红色衣服

java 复制代码
package org.xiji.Decorator;

/**
 * 红色衣服
 */
public class RedClothes extends Decorator{
    public RedClothes(Component component) {
        super(component);
    }



    @Override
    public void introduce() {
        super.introduce();
        this.wearRedClothes();

    }

    /**
     *
     * 穿一件红色的衣服
     */
    public void wearRedClothes() {
        System.out.println("穿一件红色的衣服");
    }
}

蓝色衣服

java 复制代码
package org.xiji.Decorator;

public class BlueClothes extends Decorator{
    public BlueClothes(Component component) {
        super(component);
    }

    @Override
    public void introduce() {
        super.introduce();
        this.wearBlueClothes();

    }
    /**
     * 穿了一键蓝色的衣服
     */
    public void wearBlueClothes(){
        System.out.println("穿了一件蓝色的衣服");
    }

}

5)测试类

java 复制代码
package org.xiji.Decorator;

/**
 * 装饰者模式测试类
 */
public class DecoratorMain
{
    public static void main(String[] args) {
        Component dog = new Dog();

        dog.introduce();

        //dog ==> blueClothes ==> Sunglasses
        System.out.println("=======================");
        System.out.println("给狗穿一件蓝色的衣服");
        dog = new BlueClothes(dog);
        dog.introduce();
        System.out.println("=======================");

        //把狗的衣服换下
        dog = new Dog();

        System.out.println("=======================");
        System.out.println("给狗穿上红色衣服");
        dog = new RedClothes(dog);


        System.out.println("给狗带上墨镜");
        dog = new Sunglasses(dog);
        dog.introduce();
        System.out.println("=======================");

        //创建一只宠物猫
        Component cat = new Cat();
        cat.introduce();
        System.out.println("=======================");
        System.out.println("给猫穿一件红色的衣服");
        cat = new RedClothes(cat);
        System.out.println("给猫带上墨镜");
        cat =new Sunglasses(cat);
        cat.introduce();
        System.out.println("=======================");








    }
}

5.运行结果

相关推荐
没有梦想的咸鱼185-1037-166310 分钟前
基于R语言机器学习方法在生态经济学领域中的实践技术应用
开发语言·机器学习·数据分析·r语言
a5876912 分钟前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
千里码aicood24 分钟前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan1628 分钟前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………33 分钟前
差分数组(Difference Array)
java·数据结构·算法
向上的车轮35 分钟前
基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
开发语言·云原生·golang
The Chosen One98536 分钟前
C++ : AVL树-详解
开发语言·c++
PH_modest1 小时前
【Qt跬步积累】—— 初识Qt
开发语言·qt
BillKu1 小时前
Java核心概念详解:JVM、JRE、JDK、Java SE、Java EE (Jakarta EE)
java·jvm·jdk·java ee·jre·java se·jakarta ee
怀旧,1 小时前
【C++】18. 红⿊树实现
开发语言·c++