0
点赞
收藏
分享

微信扫一扫

设计模式之—装饰器模式

装饰器模式

1.概述

装饰器模式 (Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型设计模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

  • 以动态、透明的⽅式给单个对象添加职责,但⼜能不改变其结构
  • JDK源码⾥⾯应⽤的最多的就是IO流,⼤量使⽤装饰设 计模式

在这里插入图片描述

2.代码实现

2.1抽象组件

public interface Phone {
    void call();
}

2.2被装饰者

实现Phone接口的两个实现类

实现类HuaWei

public class HuaWei implements Phone {
    
    @Override
    public void call() {
        System.out.println("华为手机打电话");
    }   
}

实现类Xiaomi

public class XiaoMi implements Phone {
    
    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }   
}

2.3装饰者组件

public class PhoneDecorator implements Phone {
	
    //传入被装饰着
    private Phone phone;
	
    //构造器内赋值
    public PhoneDecorator(Phone phone) {
        this.phone = phone;
    }
	
    //调用传入的call方法
    @Override
    public void call() {
        phone.call();
    }
}

2.4具体装饰

public class VideoPhoneDecorator extends PhoneDecorator {
	
    //装饰一个增加视频通话的功能。
    public void addVideo() {
        System.out.println("增加视频通话功能");
    }
	
    public VideoPhoneDecorator(Phone phone) {
        super(phone);
    }
	
    @Override
    public void call() {
        super.call();
        //添加一个额外功能。
        addVideo();
    }
}

2.5测试

public class Main {

    public static void main(String[] args) {
        Phone huawei = new VideoPhoneDecorator(new HuaWei());
        Phone xiaoMi = new VideoPhoneDecorator(new XiaoMi());
        huawei.call();
        System.out.println("----------");
        xiaoMi.call();
    }
}

/* 
华为手机打电话
增加视频通话功能
----------
小米手机打电话
增加视频通话功能
*/

3.总结

  • 装饰模式与继承关系的⽬的都是要扩展对象的功能,但装饰模式可以提供⽐继承更多的灵活性
  • 使⽤不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同⾏为的组合,原有代码⽆须改变,符合 “开闭原则”
  • 实现起来比较简单,但是应用相对较多。

4.Java中IO流的装饰器模式

参考

  • 抽象组件(Component):InputStream

  • 被装饰者(ConcreteComponent) : FileInputStreamByteArrayInputStream
    Component的具体实现,也就是我们要装饰的具体对象

  • 装饰者组件(Decorator):FilterInputStream
    定义具体装饰者的⾏为规范, 和Component⻆⾊有相同 的接⼝,持有组件(Component)对象的

  • 具体装饰物 (ConcreteDecorator):BufferedInputStreamDataInputStream

举报

相关推荐

0 条评论