【设计模式】17.装饰模式

本文介绍装饰模式的概念及其在软件设计中的应用。装饰模式允许在不改变原有对象的情况下动态地添加职责,提供比继承更加灵活的扩展方式。通过示例代码演示如何使用装饰模式扩展功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=medium]装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.装饰模式可以动态地扩展一个实现类的功能。
缺点:多层的装饰是比较复杂的。尽量减少装饰类的数量,以便降低系统的复杂度。
使用场景:
1.需要扩展一个类的功能,或给一类增加附加功能。
2.需要动态地给一个对象增加功能,这些功能更可以再动态地撤销。
3.需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
[/size]

package com.syc.designpatterns.chapter17;

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


package com.syc.designpatterns.chapter17;

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 com.syc.designpatterns.chapter17;

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 com.syc.designpatterns.chapter17;

public class HighScoreDecorator extends Decorator {

// 构造函数
public HighScoreDecorator(SchoolReport sr){
super(sr);
}

// 我要汇报最高成绩
private void reportHighScore(){
System.out.println("这次考试语文最高是75,数学是78,自然是80");
}

// 我要在老爸看成绩单签告诉他最高成绩,否则等他一看,就抡起扫帚揍我,我哪里还有机会说啊
public void report() {
this.reportHighScore();
super.report();
}

}

package com.syc.designpatterns.chapter17;

public class SortDecorator extends Decorator {

// 构造函数
public SortDecorator(SchoolReport sr) {
super(sr);
}

// 告诉老爸学校的排名情况
private void reportSort(){
System.out.println("我是排名第38名...");
}

// 老爸看完成绩单后再告诉他,加强作用
public void report(){
super.report();
this.reportSort();
}
}


package com.syc.designpatterns.chapter17;

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("老三");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值