设计模式初解——装饰模式

126 阅读2分钟

装饰模式介绍

装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。就增加功能来说,Decorator模式比生成子类更为灵活。 装饰者模式的类图结构如下所示 装饰者模式中类或接口的作用

  • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
  • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

实例

/**
 * 抽象构件
 */
public interface Person {
    void dress();
}
/**
 * 具体构件
 */
public class Man implements Person {
    @Override
    public void dress() {
        System.out.println("男人的穿着");
    }
}
/**
 * 抽象装饰类
 */
public abstract class Decorator implements Person {
    protected Person person;

    public Decorator(Person person) {
        this.person = person;
    }

    @Override
    public void dress() {
        person.dress();
    }
}
/**
 * 具体装饰类
 */
public class ShirtMan extends Decorator{
    public ShirtMan(Person person) {
        super(person);
    }

    @Override
    public void dress() {
        super.dress();
        System.out.println("穿衬衫");
    }
}

测试: 输出结果: 从上面的例子中,我们可以得知,男人这个对象,只有一个穿着的方法,具体穿什么无法实现,这时通过装饰者模式,可以对Man这个对象进行装饰,赋予具体穿什么的方法,这样就实现了装饰的效果。

装饰者模式在jdk中应用体现

最常见的在IO流中Inputstream运用了装饰者模式,下面具体看看源码来对比上面的示例;

首先InputStream最为被装饰对象的基类 FileInputStream作为具体被装饰的对象 FilterInputStream作为装饰者的基类,继承InputStream,并且持有InputStream对象的实例 BufferedInputStream作为具体的装饰者对象,继承了FilterInputStream,并对里面的方法进行了装饰