设计模式——装饰器模式

本文详细介绍了装饰器模式,与继承的区别,以及在Java.io包中的应用,通过新房装修和发短信的例子,展示了如何使用装饰器实现组件功能的动态扩展和组合。
摘要由CSDN通过智能技术生成
装饰器模式能够在运行时动态的为原始对象增加一些额外的功能,使其变得更加强大
与继承的区别:继承是在编译时静态的通过对原始类完成增强   

在java.io包中,大量应用到装饰器模式,例如一系列的流处理类InputStream、FileInputStream、BufferedInputStream、ZipInputStream

new BufferedInputStream(new FileInputStream("example.txt"))

举个例子 新房装修
需要定义一个接口(组件接口)该接口指定进行装饰的行为方法

public interface House {
    // 装修 
    public void decorator();
}

定义实现类(组件实现)表示需要被装饰的组件,只具备自身没有被装饰的原始特性

// 我的新家
public class MyHome implements House{
    @Override
    public void decorator() {
        System.out.println("毛坯房");
    }
}

定义装饰器抽象类,同样实现组件接口标准,且包含一个被装饰的组件
这里使用了抽象类 为了不允许用户直接实例化此类

public abstract class HouseDecorator implements House{
    
    House house;// 需要被装饰的对象

    public HouseDecorator(House house){
        this.house = house;
    }
    
    @Override
    public void decorator() {
        house.decorator();
    }
}

装饰器实现:继承装饰器抽象类,进行多种实现,在组件的基础上添加新的特性,各个装饰器类独立运行,各司其职

// 装修花园
public  class DecorateGarden extends HouseDecorator{
    public DecorateGarden(House house) {
        super(house);// 调用抽象父类的构造注入 即可调用父类的decorator方法
    }

    @Override
    public void decorator() {
        System.out.println("装修花园");
        house.decorator();
    }
}
// 装修房间
public class DecorateRoom extends HouseDecorator{
    public DecorateRoom(House house) {
        super(house); // 调用抽象父类的构造注入 即可调用父类的decorator方法
    }

    @Override
    public void decorator() {
        System.out.println("装修卧室");
        house.decorator();
    }
}
// 装修卫生间
public class DecorateWashroom extends HouseDecorator{
    public DecorateWashroom(House house) {
        super(house);// 调用抽象父类的构造注入 即可调用父类的decorator方法
    }

    @Override
    public void decorator() {
        System.out.println("装修卫生间");
        house.decorator();
    }
}

各个不同的装修功能分开运行,这样可以实现不同功能的自由搭配
当开始装修的时候

public class Start {
    public static void main(String[] args) {
        House house = new DecorateGarden(
                new DecorateRoom(new DecorateWashroom(
                        new MyHome())));

        house.decorator();

    }
}

分步开始进行装修,可以根据自己的需求,随意搭配装饰器
在这里插入图片描述

流程图
在这里插入图片描述

再举一个发短信的例子

public interface SendMsg {
     void sendMessage();
}

起初只能发文字短信

public  class Msg implements SendMsg{
    @Override
    public void sendMessage() {
        System.out.println("只能发短信");
    }
}

添加发短信功能装饰器

public abstract class MsgDecorator implements SendMsg{
    // 注意这里是SendMsg对象 不是最基础的原始组件实现类Msg
    SendMsg msg;

    public MsgDecorator(SendMsg msg){
        this.msg = msg;
    }
    @Override
    public void sendMessage() {
        // 作用
        msg.sendMessage();
    }
}

后面开始出现QQ 可以发送表情包

public class QQ extends MsgDecorator{

    // 注意这里构造函数里是SendMsg对象不是原始组件Msg类
    public QQ(SendMsg msg) {
        super(msg);
    }

    @Override
    public void sendMessage() {
        // 作用
        System.out.println("可以发表情包");
        msg.sendMessage();
    }
}

然后出现微信

public class Wechat extends MsgDecorator{
    // 这里是SendMsg对象 不是组件实现类Msg
    public Wechat(SendMsg msg) {
        super(msg);
    }

    @Override
    public void sendMessage() {
        // 作用
        System.out.println("可以打视频");
        msg.sendMessage();
    }
}

组装起来

public class Start {
    public static void main(String[] args) {
        SendMsg msg = new Wechat(new QQ(new Msg()));
        msg.sendMessage();
    }
}

在这里插入图片描述
即可得到自己想要的结果

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值