23种设计模式(5)——装饰器模式

本文通过一个Java代码示例介绍了装饰模式,它用于在不改变原有对象的基础上扩展其功能,作为继承的替代方案。装饰模式强调透明性,目标对象仍能独立提供服务,而代理模式则全权代理,目标对象不直接对外。文中通过创建House接口及其实现类,展示了装饰模式的应用,并对比了装饰模式与代理模式的区别。
摘要由CSDN通过智能技术生成

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

先看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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值