装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
一、模式类图
侧重给一个类添加一些额外的功能,是对现有功能的修补措施,并不是开发设计阶段考虑的设计方式。
二、业务应用实例
package com.hongyan.decorator;
/**
* 装饰模式
*
* @author hy
* @date 2022/01/24
*/
public class Decorator {
/**
* 抽象产品类
*
* @author hy
* @date 2022/01/24
*/
static abstract class Product{
public abstract void useMethods();
}
/**
* 具体产品
*
* @author hy
* @date 2022/01/24
*/
static class ConProduct extends Product{
@Override
public void useMethods() {
System.out.println("最早期的产品使用方法");
}
}
// 此时发现产品有缺陷,需要增加一些额外的步骤才能正常使用,此时装饰器来了
static abstract class MyDecorator extends Product{
private Product product =null;
public MyDecorator(Product product) {
this.product = product;
}
@Override
public void useMethods() {
this.product.useMethods();
}
}
static class ConMyDecorator extends MyDecorator {
public ConMyDecorator(Product product) {
super(product);
}
private void beforeUse(){
System.out.println("使用前需要。。。");
}
private void afterUse(){
System.out.println("使用后需要。。。");
}
@Override
public void useMethods() {
beforeUse();
super.useMethods();
afterUse();
}
}
public static void main(String[] args) {
Decorator.Product product = new Decorator.ConProduct();
product = new ConMyDecorator(product);
product.useMethods();
}
}
结果如下:
使用前需要。。。
最早期的产品使用方法
使用后需要。。。
三、框架应用实例
FilterInputStream包含一些其他的输入流,它使用这些输入流作为它的基本数据源,可能在过程中转换数据或提供额外的功能。FilterInputStream类本身简单地用传递所有请求到所包含的输入流的版本覆盖了InputStream的所有方法。FilterInputStream的子类可以进一步覆盖其中的一些方法,还可以提供额外的方法和字段。
总结:装饰模式侧重额外增加功能,而代理模式是让其他对象进行控制。模式需要多领悟,不断实践才能掌握其中的真谛。模式不是一种约束,而只是一种设计模式,在此之上我们也可以进行优化升级。