设计模式13 - 装饰模式【Decorator Pattern】

简介: 设计模式13 - 装饰模式【Decorator Pattern】

装饰模式

定义:

指的是在 “不必改变原类文件 ” 和 “不使用继承” 的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

举例 ( 如何让家长在差的成绩单基础上看到感觉更好的成绩 ) :

正常的学校下发成绩单流程:

public abstract class SchoolReport {
       public abstract void report();
       public abstract void sign();
}
public class FourGradeSchoolReport extends SchoolReport {
    @Override
    public void report() {
        System.out.println("语文 60 ,数学38, 英语26......");
    }
    @Override
    public void sign() {
        System.out.println("家长签名");
    }
}
public class Father {
     public void main() {
         FourGradeSchoolReport schoolReport = new FourGradeSchoolReport();
         schoolReport.report();
         //签名,休想
         //schoolReport.sign();
     }
 }

为了更好的修饰成绩单,在拿到成绩单之前做些手脚。先说出最高分,然后说自己的排名。

public class SugarFourGradeSchoolReport extends FourGradeSchoolReport {
    //汇报最高分
    public void reportHighScore() {
        System.out.println("本次最高分66");
    }
    //汇报排名
    public void reportSort() {
        System.out.println("本次排名38");
    }
    @Override
    public void report() {
        reportHighScore();//优化一下,汇报最高分
        super.report();
        reportSort();//汇报排名
    }
    @Override
    public void sign() {
        super.sign();
    }
}
public class Father {
    public void main() {
        FourGradeSchoolReport schoolReport = new FourGradeSchoolReport();
        schoolReport.report();
        //看到了report这么好,可以签名了。
        schoolReport.sign();
    }
}

引出问题:

如果我们还想继续修改,那么就要继续去继承,不仅继承超过了两层,而且类的数量会激增,维护起来也麻烦。还有基类的顺序可能会有改变。因此,要想办法引出第三种类来解决这种问题,具体新增内容的执行顺序放到子类进行。这时,装饰者模式就出现了。

public abstract class Decorator extends SchoolReport {
    private SchoolReport sr;
    public Decorator(SchoolReport sr) {
        this.sr = sr;
    }
    @Override
    public void report() {
        this.sr.report();
    }
    @Override
    public void sign() {
        this.sr.sign();
    }
}
/**
*装饰高分
*/
public class HighScoreDecorator extends Decorator {
    public HighScoreDecorator(SchoolReport sr) {
        super(sr);
    }
    public void reportHighSore() {
        System.out.println("报告最高分");
    }
    @Override
    public void report() {
        reportHighSore();
        super.report();
    }
}
/**
 * 装饰排名
 */
public class SortDecorator extends Decorator {
    public SortDecorator(SchoolReport sr) {
        super(sr);
    }
    public void reportSort() {
        System.out.println("报告排名");
    }
    @Override
    public void report() {
        reportSort();
        super.report();
    }
}
public class Father{
    public void main() {
        SchoolReport sr;
        sr = new FourGradeSchoolReport();
        sr = new HighScoreDecorator(sr);//先报告最高分(两者顺序可变)
        sr = new SortDecorator(sr);//先报告排名(两者顺序可变)
        sr.report();
        sr.sign();
    }
}

总结:

使用了装饰者模式,不改变了原来的类文件,而且不使用集成,动态的、可选择性的装饰去完成了类的拓展。

最后引出类图:

目录
相关文章
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
【八】设计模式~~~结构型模式~~~装饰模式(Java)
文章详细介绍了装饰模式(Decorator Pattern),这是一种对象结构型模式,用于在不使用继承的情况下动态地给对象添加额外的职责。装饰模式通过关联机制,使用装饰器类来包装原有对象,并在运行时通过组合的方式扩展对象的行为。文章通过图形界面构件库的设计案例,展示了装饰模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和应用示例。装饰模式提高了系统的灵活性和可扩展性,适用于需要动态、透明地扩展对象功能的情况。
【八】设计模式~~~结构型模式~~~装饰模式(Java)
|
2月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
6月前
|
设计模式
设计模式之装饰器 Decorator
设计模式之装饰器 Decorator
46 1
|
5月前
|
设计模式
结构型设计模式之装饰模式
结构型设计模式之装饰模式
|
6月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
[设计模式Java实现附plantuml源码~结构型] 扩展系统功能——装饰模式
|
6月前
|
设计模式 Go
[设计模式 Go实现] 结构型~装饰模式
[设计模式 Go实现] 结构型~装饰模式
|
6月前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
49 1