装饰者模式

应用场景】 

 装饰者模式又称为包装模式,主要是为客户端透明的扩展被调用者的功能。动态的给一个对象附加上更多的功能,是继承关系的一个替代方案。我们可以不断进行装饰,丰富扩展功能,形成一条装饰者链。其实我们子类重写父类的方法也是同样的思想,只是相比较下装饰者模式更加的灵活,能动态的增加或删除功能(就是编写起来会麻烦些)。

结构类图

  1. 定义一个接口,规范某个行为。

  2. 被装饰者实现这个接口,实现最基本的功能。

  3. 编写装饰者角色,实现同一个接口(这个类的存在是为了避免我们对原有对象的操作)。

  4. 根据业务需求,编写一个或多个具体的装饰者提供相应的功能。

  

案例编写

   一:先定义接口,规范行为

/**
 * 一:抽象接口,规范行为
 * @author wuLei
 */
public interface User {
    public void skill();
}

  二: 编写被装饰的类,实现基本功能。

复制代码
/**
 * 二:具体的的行为类(被装饰者)
 * @author wuLei
 */
public class Wulei implements User{

    @Override
    public void skill() {
        System.out.println("大家好,我是吴磊!");
    }
}
复制代码

   三:定义装饰者角色

复制代码
/**
 * 三:定义装饰者角色,同样要继承于接口
 * @author wuLei
 */
public abstract class DecoratorUser implements User{

    private User user;
    //通过有参构造获取user的实例
    public DecoratorUser(User user) {
        this.user = user;
    }
    @Override
    public void skill() {
        // 重写之前的方法,让它具备之前的功能。
        user.skill();
    }
}
复制代码

   四:定义具体的装饰者添加新功能,我这里编写了3各类扩展功能。

复制代码
/**
 * 四:具体的装饰者1
 * @author wuLei
 */
public class Wulei1 extends DecoratorUser{

    public Wulei1(User user) {
        super(user);
    }
    @Override
    public void skill() {
        // 重写之前的方法,让它具备之前的功能。
        super.skill();
        //新增一个功能
        springCloud();
    }

    private void springCloud() {
        System.out.println("我会SpringCloud技术栈");
    }
}
复制代码
复制代码
/**
 * 五:具体的装饰者2
 * @author wuLei
 */
public class Wulei2 extends DecoratorUser{

    public Wulei2(User user) {
        super(user);
    }

    @Override
    public void skill() {
        // 重写之前的方法,让它具备之前的功能。
        super.skill();
        //新增一个功能
        linux();
    }

    private void linux() {
        System.out.println("我会Linux环境部署");
    }
}
复制代码
复制代码
/**
 * 六:具体的装饰者3
 * @author wuLei
 */
public class Wulei3 extends DecoratorUser{

    public Wulei3(User user) {
        super(user);
    }

    @Override
    public void skill() {
        // 重写之前的方法,让它具备之前的功能。
        super.skill();
        //新增一个功能
        hadoop();
    }

    private void hadoop() {
        System.out.println("我会hadoop大数据");
    }
}
复制代码

   五:编写测试类

复制代码
/**
 * 七: 测试
 * @author wuLei
 */
public class Test {
    public static void main(String[] args) {
        Wulei3 w3 = new Wulei3(new Wulei2(new Wulei1(new Wulei())));
        w3.skill();
        
        System.out.println("--------------");
        
        Wulei2 w2 = new Wulei2(new Wulei());
        w2.skill();
    }
}





====================
【控制台输出结果】


大家好,我是吴磊!
我会SpringCloud技术栈
我会Linux环境部署
我会hadoop大数据
--------------
大家好,我是吴磊!
我会Linux环境部署
复制代码

 

 JDK实例:

  从下图I/O库的结构图可以看出:

  抽象构件角色InputStream扮演。这是一个抽象类,为各种子类型提供统一的接口。

  具体构件ByteArrayInputStream、FileInputStream、PipedInputStream、StringBufferInputStream等类扮演。它们实现了抽象构件角色所规定的接口。

  抽象装饰角色FilterInputStream扮演。它实现了InputStream所规定的接口。

  具体装饰几个类扮演,分别是BufferedInputStream、DataInputStream以及两个不常用到的类LineNumberInputStream、PushbackInputStream。

  

所以,我们在调用的时候,可以做如下组合,形成装饰者链:

InputStream in = new LineNumberInputStream(new BufferedInputStream(newFileInputStream(file)));

 

  

posted @   吴磊的  阅读(208)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
//生成目录索引列表
点击右上角即可分享
微信分享提示