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

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

栗子

以成绩单需要家长签字为要求。

成绩单类图

// 抽象成绩单
public abstract class SchoolReport{
	// 成绩单你的成绩情况
	public abstract void report();
	// 成绩单要求家长签字
	public abstract void sign();
}

下面书写四年级成绩单

public class FouthGradeSchoolReport extends SchoolReport{
	// 自己的成绩单
	public void report(){
	}
	// 家长签名
	public void sign(String name){
	}
}

使用装饰器模式

使用装饰器模式,对成绩单进行装饰。

直接增加一个子类,重写report方法。

// 在成绩单下增加一个子类
public class SugarFouthGradeSchoolReport extends FouthGradeSchoolReport{
	// 对成绩进行美化
	private void reportHighScore(){
	}
	// 看完成绩单,再汇报排名
	private void reportSort(){
	}
	// 对父类重写,即report原先的成绩单进行重写
	public void report(){
		this.reportHighScore();	// 最高成绩
		// 显示成绩单
		super.report();
		// 再告诉排名
		this.reportSort();	
	}
}

最后场景类

public class Father{
	public static void main(String[] args){
		// 生成美化后的成绩单
		SchoolReport sr = new SugarFouthGradeSchoolReport();
		// 看成绩单
		sr.report();
		// 签名
		sr.sign("");
	}
}

继续改进

如果要装饰的太多,不可能无限的增加子类。

代码如下

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);
	}
}

核心在于通过构造函数,将要装饰的对象传入。再重写方法。

public class HighScoreDecorator extends Decorator {
	// 构造函数
	public HighScoreDecorator(SchoolReport sr){
		super(sr);
	}
	// 对成绩修改
	private void reportHighScore(){
	}
	// 重写汇报方法,对进行进行汇报
	public void report(){
		this.reportHighScore();
		this.report();
	}
}

然后紧接着,对排名进行修饰

public class SortDecorator extends Decorator{
	// 构造函数
	public SortDecorator(SchoolReport sr){
		super(sr);
	}
	// 对排名装饰
	private void reportSort(){
		
	}
	// 输出成绩
	public void report(){
		super.report();
		this.reportSort();
	}
}

最后书写场景类

public class Father{
	public static void main(String[] args){
		// 定义成绩单
		SchooReport sr;
		// 获取原装成绩单
		sr = new FouthGradeSchoolReport();
		// 对成绩单进行装饰
		sr = new HighScoreDecorator(sr);
		sr = new SortDecorator(sr);
		// 最后,看成绩单
		sr.report();
		// 签名
		sr.sign("");
	}
}

应用

登录页面数据上报,使用装饰器,将登录层页面,上传到上报类中,进行装饰上统计代码,然后将统计数据上报。

动态改变函数参数,原先有一个正常的函数,通过装饰器,将正常的函数传入,装饰模式

应用ajax加token防止csrf攻击

表单验证,将表单验证的内容,写成一个类,然后需要哪个验证的选项,直接将表单验证传入即可,达到装饰器的目的,同时也达到了插件式的验证。

总结

核心在于装饰二字,将要装饰的对象,通过构造函数传入,然后再赋值,达到装饰的目的,然后再次调用即可。

wx.png

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

设计模式(6)-装饰器(认识程序中的装饰器)

之前已经看过装饰器模式,但是感觉不是很清晰,但是有一种情况下出的代码,一定是装饰器。 Widget* aWidget = new BorderDecorator...

33270
来自专栏Java技术栈

刚写完这段代码,就被开除了……

显然不是,休眠的逻辑,大家都懂,不需要写注释,你注释写休眠 1 天也没意义啊。。。

17810
来自专栏窗户

用sed实现wc -w的功能

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址   http://www.cnblogs.com/Colin-C...

24160
来自专栏大前端开发

【趣解编程】变量

如果把编程比作做菜的话,变量就是那些碗盆瓢勺,或装着原材料,或在做菜的过程中临时的摆放半成品,或装着最后的成品菜。

10440
来自专栏函数式编程语言及工具

Akka(2):Actor生命周期管理 - 监控和监视

  在开始讨论Akka中对Actor的生命周期管理前,我们先探讨一下所谓的Actor编程模式。对比起我们习惯的行令式(imperative)编程模式,Actor...

39980
来自专栏刘望舒

设计模式之装饰模式

相关文章 设计模式之设计六大原则 设计模式之单例模式的七种写法 设计模式之建造者模式 设计模式之简单工厂模式 设计模式之观察者模式 设计模式之代理模...

23470
来自专栏aCloudDeveloper

算法导论第十一章 散列表

一、散列表的概念 本章介绍了散列表(or hash table)的概念、散列函数的设计及哈希冲突的处理。散列表(为了形象描述,我们通常叫槽)从表意上看是一种数...

27660
来自专栏Core Net

一个插排引发的设计思想 (一) 观察者模式

30160
来自专栏java技术学习之道

java设计模式之装饰者模式

12160
来自专栏数据结构与算法

HDU 1848 Fibonacci again and again(SG函数)

Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; ...

35660

扫码关注云+社区

领取腾讯云代金券