装饰者模式

装饰者模式作为继承的替代方案,用于为现有类添加功能。本文通过一个考试报告的场景来说明装饰者模式的运用:创建报告接口、实现接口、定义公共装饰类及具体装饰类(如最高分和班级排名),并展示如何调用这些装饰类以实现功能扩展。该模式允许装饰类和被装饰类独立发展,降低耦合,但多层装饰可能导致复杂性增加。
摘要由CSDN通过智能技术生成

原文地址:https://www.jianshu.com/p/2fe021a2a9df

为现有的类增加功能,是继承的一种替代方式
类图如下

 

装饰者模式类图

假设一个场景
我们在学校要考试,然后要给家长签字,说分数之前你要先汇报一下班级最好成绩,然后说出你的分数之后,在说出你在班级的排名
1,建立一个抽象的报告接口

public interface SchoolReport {
    void report();
    void sign(String name);
}

2,实现这个成绩报告接口

public class FourthGradeSchoolReport implements SchoolReport{
    @Override
    public void report() {
        System.out.println("尊敬的家长");
        System.out.println("``````````");
        System.out.println("语文 62 数学 65 体育89 自然63");
        System.out.println("``````````");
        System.out.println("家长签名:");
    }

    @Override
    public void sign(String name) {
        System.out.println("家长签名为:" +name);
    }
}

3,建立一个公共装饰类,具体的装饰要在具体装饰类中定义


    private SchoolReport sr;

    public Decorator(SchoolReport sr){
        this.sr = sr;
    }


    @Override
    public void report() {
        this.sr.report();
    }

    @Override
    public void sign(String name) {
        this.sr.sign(name);
    }
}

5,创建具体的装饰,最高分装饰类

public class HighScoreDecorator extends Decorator{

    public HighScoreDecorator(SchoolReport sr) {
        super(sr);
    }

    private void reportHighScore(){
        System.out.println("这次考试最高分 语文 75 数学 78 体育93 自然80");
    }

    @Override
    public void report() {
        this.reportHighScore();
        super.report();
    }
}

6,学校排名装饰类

public class SortScoreDecorator extends Decorator{

    public SortScoreDecorator(SchoolReport sr) {
        super(sr);
    }

    private void reportSort(){
        System.out.println("我的排名第38名");
    }

    @Override
    public void report() {
        super.report();
        this.reportSort();
    }
}

7,实现调用

public class Main {
    public static void main(String[] args){
        SchoolReport sr = new FourthGradeSchoolReport();
        sr = new HighScoreDecorator(sr);
        sr = new SortScoreDecorator(sr);
        sr.report();
        sr.sign("张三");
    }
}

总结,如果说我们要实现更多的功能可以创建更多的装饰具体装饰类,装饰类和被装饰类可独立发展,互相不耦合
缺点是,多层装饰比较复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值