Java设计模式 - 装饰模式

作者: a57ecf3aaaf2 | 来源:发表于2016-10-10 17:37 被阅读128次

装饰模式

装饰模式重在“装饰”二字,这也是与代理模式的最大区别,很多人分不清两者的区别,甚至不假思索地就相信了网上以讹传讹的不正确的区别描述。

来看一个简单的装饰模式写法:

public abstract class Phone {
    /**
     * 加上保护套
     */
    public void attachJacket() {
        System.out.println("给手机加上保护套");
    }
}
public class IPhone extends Phone {

    /**
     * 贴膜
     */
    public void attachFilm() {
        System.out.println("给手机贴膜");
    }

    @Override
    public void attachJacket() {
        attachFilm();
        super.attachJacket();
    }
}

一个手机基类,一台iPhone手机是一台手机的属类,除了继承了基类“可添加保护套”的功能,也实现了自己的装饰:给手机贴膜。

装饰模式的核心就是在既有功能的前提下添加新的扩展功能。

以上例子是通过新增方法扩展功能的,下面介绍另一个列子,将每一个功能作为一个类,该类持有需要装饰者的实例:

public abstract class Phone {

    /**
     * 加上其他装饰
     */
    public void attach() {

    }
}
public class DecoratorPhone extends Phone {
    protected Phone phone;

    public DecoratorPhone(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void attach() {
        phone.attach();
    }
}
public class FilmPhone extends DecoratorPhone {

    public FilmPhone(Phone phone) {
        super(phone);
    }

    @Override
    public void attach() {
        phone.attach();
        System.out.println("给手机贴膜");
    }
}
public class JacketPhone extends DecoratorPhone{
    public JacketPhone(Phone phone) {
        super(phone);
    }

    @Override
    public void attach() {
        phone.attach();
        System.out.println("给手机附上保护套");
    }
}
public class Client {
    public static final void main(String[] args) {
        Phone phone = new IPhone(); //待装饰对象
        FilmPhone fp = new FilmPhone(phone); //贴膜
        JacketPhone jp = new JacketPhone(fp); //添加手机套
        jp.attach();
    }
}

print:

给手机贴膜
给手机附上保护套

IPhone有其默认的装饰,通过FilmPhone持有IPhone实例,为IPhone添加贴膜装饰,JacketPhone再为其添加保护套。

JDK中的装饰模式

JDK中的输入、输出流就是典型的装饰模式,且大量使用了装饰模式与适配器模式。

FileInputStream fis = new FileInputStream("");
ObjectInputStream ois = new ObjectInputStream(fis);
ois.read();
public class ObjectInputStream
    extends InputStream implements ObjectInput, ObjectStreamConstants {
    
    public int read(byte[] buf, int off, int len) throws IOException {
        if (buf == null) {
            throw new NullPointerException();
        }
        int endoff = off + len;
        if (off < 0 || len < 0 || endoff > buf.length || endoff < 0) {
            throw new IndexOutOfBoundsException();
        }
        return bin.read(buf, off, len, false);
    }
}

装饰模式和代理模式的区别

装饰模式和代理模式的区别,并非网上所说的装饰模式对外暴露被装饰者,而代理模式隐藏了被代理者,两者都可以通过构造函数传入被装饰或被代理对象。

装饰模式其实是代理模式中的一种特殊情况,其共同点是都具有相同的接口;不同的是,装饰模式重在对功能的增强或减弱,而代理模式注重控制代理者的权限,强制代理就是一个明显的区别。

本文由Fynn_原创,未经许可,不得转载!

相关文章

  • 装饰者模式——IO流运用

    推荐博客Java设计模式学习09Java设计模式学习09Java设计模式学习09 装饰者模式还是比较难懂的。。。。...

  • Java设计模式——单例模式(Singleton Pattern

    从上一篇文章Java设计模式——装饰模式(Decorator Pattern)中估计大家都已经对java设计模式有...

  • java IO 的知识总结

    装饰者模式 因为java的IO是基于装饰者模式设计的,所以要了解掌握IO 必须要先清楚什么事装饰者模式(装饰者模式...

  • Java设计模式之装饰器模式

    Java设计模式之装饰器模式 本文仅是个人观点,如有错误请指正 简介 装饰器模式(Decorator Patter...

  • Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:《Java设计模式系列-装饰器模式》 一、概述 装饰器模式作用是针对目标方法进行增强,提...

  • Java设计模式之 —— 装饰者(Decorator) — 点

    Java设计模式之 —— 装饰者(Decorator) — 点炒饭 下面会用做炒饭的例子来描述一下装饰者设计模式,...

  • Java设计模式-装饰模式

    这篇文章我们来一起学习一下设计模式中的装饰模式,这是一个说简单也简单说不简单也不简单的一个模式,我们要理解的是它的...

  • Java设计模式----装饰模式

    职责 动态的位一个对象增加新的功能。 装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。...

  • java设计模式——装饰模式

    装饰模式 1.定义: 动态的给一个对象添加一些额外的职责。就增加功能来讲,装饰模式比生成子类更为灵活。 2.使用场...

  • Java设计模式--装饰模式

    装饰模式的定义是:装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的...

网友评论

    本文标题:Java设计模式 - 装饰模式

    本文链接:https://www.haomeiwen.com/subject/kelvyttx.html