设计模式系列教程(12) - 装饰模式

简介: 设计模式系列教程(12) - 装饰模式

代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/Java-DesignMode

1. 什么是装饰模式

装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:

1.Component为统一接口,也是装饰类和被装饰类的基本类型。

2.ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。

3.Decorator是装饰类,实现了Component接口的同时还在内部维护了一ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。

4.ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

2.装饰模式案例

House:

public interface House {
    void run();
}

HouseImpl:

public class HouseImpl implements House {
    @Override
    public void run() {
        System.out.println("贴上蜡笔小新墙纸...");
    }
}

HouseDecorate:

public class HouseDecorate implements House {
    private House house;
    public HouseDecorate(House house){
        this.house=house;
    }
    @Override
    public void run() {
        house.run();
    }
}

HouseDecorateImpl:

public class HouseDecorateImpl extends HouseDecorate {
    public HouseDecorateImpl(House house) {
        super(house);
    }
    @Override
    public void run() {
        super.run();
        System.out.println("贴上火影忍者墙纸...");
    }
}

测试:

public class Client {
    public static void main(String[] args) {
        HouseImpl houseImpl = new HouseImpl();
        houseImpl.run();
        System.out.println("###新增贴上墙纸..###");
        HouseDecorate houseDecorate = new HouseDecorateImpl(houseImpl);
        houseDecorate.run();
    }
}

3.装饰与代理的区别

装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说:

用代理模式:代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。

用装饰器模式:我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

4. 装饰模式的应用场景

在IO中,具体构件角色是节点流,装饰角色是过滤流。

FilterInputStream和FilterOutputStream是装饰角色,而其他派生自它们的类则是具体装饰角色。

DataoutputStream out=new DataoutputStream(new FileoutputStream());

这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。这里不会调用到装饰者类–FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张。

总结

目录
相关文章
|
1月前
|
设计模式 Java API
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
22天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
36 2
|
22天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
23 2
|
27天前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
41 2
|
27天前
|
设计模式 Java API
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
Kotlin教程笔记(50) - 改良设计模式 - 工厂模式
39 2
|
27天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 1
|
27天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
36 1
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式