设计模式 结构型设计模式之装饰模式

1 基础知识

1.1 标准定义

装饰(Decorator)模式标准定义:动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

1.2 分析和说明

装饰模式属于结构型设计模式。装饰模式用于动态地为对象附加额外的职责,以达到扩展其功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤销。增加由一些基本功能的排列组合而产生的非常大量的功能。

装饰结构角色包括抽象构件(Component)角色、具体构件(Concrete Component)角色、装饰(Decorator)角色和具体装饰(Concrete Decorator)角色。

抽象构件角色:给出一个抽象接口,以规范准备接收附加责任的对象。抽象构件角色作为整个装饰模式类图体系的超类,其子类均可以被增添附加责任。

具体构件角色:定义一个将要接收附加责任的类。

装饰角色:持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。

具体装饰角色:负责给构件对象添加附加的责任。


2 应用场景举例

比如公司的软件工程都是由需求分析、设计、编码、测试、部署和维护组成。这只是一般过程,但是万一有的时候要加上需求分析验证,有的时候要加上设计验证等过程。就可以通过装饰模式来实现。软件工程过程是抽象构件角色,标准软件工程过程是具体构件角色。定义一个将要接收附加责任的类,附加验证是装饰角色。需求分析验证是具体装饰角色。

可以把AbstractProcess类理解为抽象构件(Component)角色。StandardProcess类是具体构件角色。AdditionalProcess类是一种装饰角色。DesignCheckProcess类 和RequestVerificationProcess类是具体装饰角色。其实现类图如下图:

对于增加项目过程的方式有两种,一种是直接在标准的项目过程中加入项目过程,还有一种是附加项目过程,然后接着在附加项目过程中加入项目过程。第一种方式要修改整个全局项目过程的内容,所以改动比较大,而采用第二种方式,只是修改附加项目过程,只是修改了部分内容。


3 Java的实现程序代码

Java程序实现主要包括AbstractProcess类文件,StandardProcess类文件,AdditionalProcess类文件,DesignCheckProcess类文件和RequestVerificationProcess类文件。

AbstractProcess类程序代码为:

public class AbstractProcess {
protected List<String> componentList = new ArrayList<String>();
public void addProcess(String Process){
componentList.add(Process);
}

public void showProcess(){
if(componentList == null){
System.out.println("没有过程");
}
for(int i = 0; i < componentList.size(); i++){
System.out.print(componentList.get(i)+";");
}
}
}

StandardProcess类文件程序代码为:

public class StandardProcess extends AbstractProcess{
public StandardProcess(){
initizeProcess();
}

public void initizeProcess(){
addProcess("需求分析过程");
addProcess("设计过程");
addProcess("编码过程");
addProcess("测试过程");
addProcess("部署过程");
addProcess("维护过程");
}
}

AdditionalProcess类文件代码为:

public class AdditionalProcess extends AbstractProcess{
protected AbstractProcess actualProcess;
public void setActualProcess(AbstractProcess actualProcess){
this.actualProcess = actualProcess;
}
}


DesignCheckProcess类文件和RequestVerificationProcess类文件为:

public class DesignCheckProcess extends AdditionalProcess{
public  void ConcreteActualProcess(){
actualProcess.addProcess("设计检查");
}
}


public class RequestVerificationProcess extends AdditionalProcess{
public  void ConcreteActualProcess(){
actualProcess.addProcess("需求验证");
}
}

装饰模式测试代码为:

public class Client {
public static void main(String[] args){
AbstractProcess projectProcess = new StandardProcess();
System.out.println("--项目的标准过程---");
projectProcess.showProcess();
System.out.println();

//附加需求验证过程
RequestVerificationProcess projectAddProcess1 = new RequestVerificationProcess();
projectAddProcess1.setActualProcess(projectProcess);
projectAddProcess1.ConcreteActualProcess();
System.out.println("--增加需求验证后的项目过程---");
projectProcess.showProcess();


//附加设计检查过程
DesignCheckProcess designCheckProcess = new DesignCheckProcess();
designCheckProcess.setActualProcess(projectProcess);
designCheckProcess.ConcreteActualProcess();
System.out.println("--再增加设计检查过程后的项目过程---");
projectProcess.showProcess();


}
}




Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值