设计模式之装饰模式

装饰模式简介:

装饰模式就是动态地给一个对象添加一些额外的职责,在一个类的基础上,在不改变原有类的情况下,在外部对类的功能进行扩展。

装饰模式中出现的角色

Component抽象构件

Component

是一个接口或者是抽象类, 就是我们定义我们最核心的对象。

ConcreteComponent

ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 我们所要装饰的就是这个实现类。

Decorator

实现Compoent,在它的属性里必然有一个private变量指向Component抽象构件。

具体装饰角色

ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 也就是把最核心的、 最
原始的、 最基本的东西(ConcreteComponent )装饰成其他东西。

具体实现用例

在这里插入图片描述代码如下:

package Decorator;

public abstract class SchoolReport {
    //成绩单主要展示的就是你的成绩情况
    public abstract void report();
    //成绩单要家长签字
    public abstract void sign(String name);
}
package Decorator;

public  class FouthGradeSchoolReport extends SchoolReport {
    
    public void report() {

        System.out.println("尊敬的XXX家长:");
        System.out.println(" ......");System.out.println(" 语文 62 数学65 体育 98 自然 63");
        System.out.println(" .......");
        System.out.println(" 家长签名: ");
    }
    //家长签名
    public void sign(String name) {
        System.out.println("家长签名为: "+name);
    }
}
package Decorator;

public abstract class Decorator extends SchoolReport{
    //首先我要知道是哪个成绩单
    private SchoolReport sr;
    //构造函数, 传递成绩单过来
    public Decorator(SchoolReport sr){
        this.sr = sr;
    }//成绩单还是要被看到的
    public void report(){
        this.sr.report();
    }//看完还是要签名的
    public void sign(String name){
        this.sr.sign(name);
    }
}
package Decorator;

public class HighScoreDecorator extends Decorator {
    //构造函数
    public HighScoreDecorator(SchoolReport sr){
        super(sr);
    }//我要汇报最高成绩
    private void reportHighScore(){
        System.out.println("这次考试语文最高是75, 数学是78, 自然是80");
    }//我要在老爸看成绩单前告诉他最高成绩, 否则等他一看, 就抡起扫帚揍我, 我哪里还有机会说啊
    @Override
    public void report(){
        this.reportHighScore();
        super.report();
    }
}
package Decorator;

public class SortDecorator extends Decorator {
    //构造函数
    public SortDecorator(SchoolReport sr){super(sr);
    } //告诉老爸学校的排名情况
    private void reportSort(){
        System.out.println("我是排名第38名...");
    } //老爸看完成绩单后再告诉他, 加强作用
    @Override
    public void report(){
        super.report();
        this.reportSort();
    }
}
package Decorator;

public class Father {
    public static void main(String[] args) {
//把成绩单拿过来
        SchoolReport sr;
//原装的成绩单
        sr = new FouthGradeSchoolReport();
//加了最高分说明的成绩单
        sr = new HighScoreDecorator(sr);
//又加了成绩排名的说明
        sr = new SortDecorator(sr);
//看成绩单
        sr.report();
//然后老爸一看, 很开心, 就签名了
        sr.sign("父亲签名"); 
    }
}

执行结果:

在这里插入图片描述

调用链分析

在这里插入图片描述SortDecorator调用父类构造方法,将HighScoreDecorator实例作为Decorator 的SchoolReport 实现。
所以调用SortDecorator的report方法,会进入Decorator 的report方法,然后在里面执行this.sr.report();这里的this.sr根据客户端放入的顺序,实际上是HighScoreDecorator对象实例。
然后进入HighScoreDecorator的report()然后执行this.reportHighScore(){相当于扩展的功能},然后调用super.report()最后会执行原始的FouthGradeSchoolReport的report(){这个方法是我们本身要执行的最朴素的方法},至此调用链过程分析完了。

所以进行总结:
装饰类和被装饰类可以独立发展, 而不会相互耦合,装饰模式可以动态地扩展一个实现类的功能。

装饰模式使用场景:

1:需要扩展一个类的功能, 或给一个类增加附加功能。

2:需要为一批的兄弟类进行改装或加装功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值