23种设计模式——装饰器模式

Posted cj_eryue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式——装饰器模式相关的知识,希望对你有一定的参考价值。

装饰模式是对客户端以透明的方式扩展对象的功能,是继承关系的一个替代方案。也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不用创造更多子类的情况下,将对象的功能加以扩展,装饰模式的关键在于这种扩展是完全透明的。

先看demo:

先定义一个接口,以及两个实现类

package com.cjian.GOF.decorator;

public interface House {
    //装饰风格
    void style();
}
package com.cjian.GOF.decorator;

/**
 * @description: 待增强类
 * @time: 2021/8/31 9:55
 */
public class EuropeanStyle implements House{
    @Override
    public void style() {
        System.out.println("风格为欧式!");
    }
}
package com.cjian.GOF.decorator;
/**
 * @description: 待增强类
 * @time: 2021/8/31 9:55
 */
public class EuropeanStyle implements House{
    @Override
    public void style() {
        System.out.println("风格为欧式!");
    }
}

接着编写装饰器类,即增强的功能

package com.cjian.GOF.decorator;

/**
 * @description: 抽象装饰类
 * @time: 2021/8/31 9:56
 */
public class HouseDecorator implements House{
    public House house;

    public HouseDecorator(House house) {
        this.house = house;
    }

    @Override
    public void style() {
        house.style();
    }
}

编写增强的具体功能:

package com.cjian.GOF.decorator;

/**
 * @description: 具体装饰类
 * @time: 2021/8/31 9:57
 */
public class RedDecorator extends HouseDecorator{

    public RedDecorator(House house) {
        super(house);
    }

    public void style() {
        this.house.style();
        System.out.println("红色装饰墙--增强");
    }
}

测试:

package com.cjian.GOF.decorator;

/**
 * @description:
 * @time: 2021/8/31 9:59
 */
public class Test {

    public static void main(String[] args) {
        ChineseStyle chineseStyle = new ChineseStyle();
        chineseStyle.style();
        System.out.println("--------------------");
        House redChineseStyle  = new RedDecorator(chineseStyle);
        redChineseStyle.style();
        System.out.println("--------------------");
        House redEuropeanStyle  = new RedDecorator(new EuropeanStyle());
        redEuropeanStyle.style();

    }
}

这看上去有点代理的味道 ,我们需要从概念上了解代理和装饰的区别:

  1. 代理是全权代理,目标根本不对外,全部由代理类来完成。
  2. 装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用。

demo参考:https://www.jb51.net/article/149466.htm

以上是关于23种设计模式——装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

Java23种设计模式之结构型模式「装饰器模式」

GoF 23 种设计模式之门面模式和装饰器模式

23种设计模式——装饰器模式

23种设计模式之装饰器模式(Decorator Pattern)

23种设计模式——装饰模式单一职责

23种设计模式之四(装饰者模式)