Java设计模式之静态代理模式(装饰着模式)

本文深入探讨了装饰者模式,一种允许在不修改原有代码的情况下,动态地为对象添加新的功能的设计模式。通过具体实例,展示了如何使用装饰者模式增强对象的行为,同时保持代码的灵活性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静态代理模式与装饰着模式本质上是有区别的,但是具体的区别以后再说,大体上还是有很多共同点的,装饰着模式本质是不对原有对象或者方法改变而增强程序或者方法的功能,实现的是无侵入式编程。
实现要求:
1.被装饰类与装饰类实现同一个接口 目的式是实现无侵入式变成
2.装饰类必须持有原有对象的引用,
3.装饰者去将要增强的方法重写
4.装饰者将不需要增强的方法直接引用
下面是没有被装饰的情况:
接口:
package cn.itcast.test.jt;

/**
 * @Description: 房子的模型
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public interface HouseM {
    void createHouseM();
    void beanDoor();
}
实现类
package cn.itcast.test.jt;

/**
 * @Description: 造一个房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:12$
 */
public class CHM implements HouseM {
    @Override
    public void createHouseM() {
        System.out.println("这个房子有桌子");
        System.out.println("这个房子有床铺");
    }

    @Override
    public void beanDoor() {
        System.out.println("这个门很好,不需要被装饰");
    }
}
下面是测试类:
package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到实现类
    public static HouseM getInterface(){
        //创建一个被装饰类
        CHM chm = new CHM();
        //创建一个装饰类
        //DecorateH decorateH = new DecorateH(chm);
        return chm;
    }

    public static void main(String[] args) {
        HouseM houseM = getInterface();
        houseM.beanDoor();
        System.out.println("------------------------");
        houseM.createHouseM();
    }
}

输出

这个门很好,不需要被装饰
------------------------
这个房子有桌子
这个房子有床铺
给位装饰着模式,对房子进行装饰,新建装饰类
package cn.itcast.test.jt;

import com.mchange.v3.decode.Decoder;

/**
 * @Description: 装饰房子
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:14$
 */
public class DecorateH implements HouseM { //装饰着必须实现原有对象的接口
    //装饰者必须持有原有对象的引用
    private HouseM chm;

    public DecorateH(HouseM chm){
        this.chm = chm;
    }

    @Override
    public void createHouseM() {
        System.out.println("房子需要装饰");
        System.out.println("给房子涂点颜料");
        System.out.println("----------------------------");
        chm.createHouseM();
        System.out.println("---------是不是很好看---------");
    }

    @Override
    public void beanDoor() {
        chm.beanDoor();
    }
}
重写测试类
package cn.itcast.test.jt;

/**
 * @Description:
 * @Author: zc
 * @CreateDate: 2018/11/25$ 12:18$
 */
public class Test {
    //得到实现类
    public static HouseM getInterface(){
        //创建一个被装饰类
        CHM chm = new CHM();
        //创建一个装饰类
        DecorateH decorateH = new DecorateH(chm);
        return chm;
    }

    public static void main(String[] args) {
        HouseM houseM = getInterface();
        houseM.beanDoor();
        System.out.println("------------------------");
        houseM.createHouseM();
    }
}
测试结果
这个门很好,不需要被装饰
------------------------
房子需要装饰
给房子涂点颜料
----------------------------
这个房子有桌子
这个房子有床铺
---------是不是很好看---------

总结:
动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。实习的是一种面向接口的编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值