设计模式7:装饰者模式

装饰者模式是要解决什么问题?

官方说法:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

个人理解:原始接口功能不足,需要添加新方法,但是别的地方已经实现了原始接口,所以原始接口又不能直接添加方法。这时候可以采用持有原始类对象,并且添加新方法的方式,实现新功能。并且继承原始类或者实现原始接口,达到可替换原始类的目的。

装饰者模式在JDK中有哪些实际应用?

FilterInputStream
InputStream是一个抽象类,源码:

public abstract class InputStream implements Closeable {
    ...
    public abstract int read() throws IOException;    
    ...
}

InputFilterStream源码:

public
class FilterInputStream extends InputStream {

    protected volatile InputStream in;
    ...

    public int read() throws IOException {
        return in.read();
    }
	...
}

BufferedInputStream源码:

public
class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    
    public BufferedInputStream(InputStream in, int size) {
        super(in); //注意这里调用了FilterInputStream的构造器
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }

    public synchronized int read() throws IOException {
        if (pos >= count) {
            fill();
            if (pos >= count)
                return -1;
        }
        return getBufIfOpen()[pos++] & 0xff;
    }

	...

    private InputStream getInIfOpen() throws IOException {
        InputStream input = in;
        if (input == null)
            throw new IOException("Stream closed");
        return input;
    }

	...
	
}

三个类完整的方法:
InputStream是抽象类,且只有一个抽象方法。

FilterInputStream并没有增加方法,只是持有了InputStream的实例。

BufferedInputStream增加了几个方法,例如:getInIfOpen()

使用BufferedInputStream:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/home/user/abc.txt")));

Java IO 中的流与设计模式

装饰者模式在Android SDK中有哪些实际应用?

装饰者模式和适配器模式的区别是什么?

简单讲:装饰者模式解决的是原始类功能不足的问题。适配器模式解决的是原始类有这个功能,但是功能不匹配的问题。
例如原始类有裤子,但是没有鞋子,这个时候用装饰器模式。原始类有鞋子,但是鞋码大了,不合适,这个时候用适配器模式。

装饰者模式:

  • 装饰者模式(Decorator Pattern)目的是为原始类对象动态地添加新功能。解决原始类功能不足的问题。
  • 装饰者类起功能增强作用。
  • 继承原有类,创建一个装饰器类,将原始类对象包装在装饰器中,以组合的方式来添加功能。

适配器模式:

  • 适配器模式(Adapter Pattern)目的是为了实现目标接口,解决原始类功能不匹配的问题。使目标接口和原始类进行交互。
  • 适配器类起一个桥梁的作用。
  • 适配器模式通过创建一个适配器类,配合原始类的方法,实现目标接口的方法。

装饰者模式和代理模式的区别是什么?

  • 目的不同:装饰者模式是为了扩展原有对象的功能,在装饰者中添加新的方法。代理模式是为了控制原有对象的访问,在原有对象的方法上做了修改。
  • 方法数量不同:装饰者模式中,装饰者的方法数量比被装饰者多,因为要添加新的方法。代理模式一般情况下方法数量和父类相同。
  • 原有对象访问修饰符不同:装饰者模式中,原有对象的访问修饰符一般是protected
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjin1120

可靠的文章费时费力,希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值