菜鸟版JAVA设计模式—从火锅底料到装饰器模式

今天开始学历了JAVA设计模式中的装饰模式,照例还是写下自己理解的心得吧。

装饰器模式,啥是装饰器模式?带着这个问题,咱们好好的去火锅店吃个火锅。

“老板,来份全辣锅底,不要给我用装饰器模式来配料!”我特地狠狠的强调了最后一句话。

不到一会,老板给我端来了一个火锅和几个盘子,火锅里装了盐水,而盘子里放了辣椒,花椒,茴香,大蒜等佐料。。。。。。。。。。

这时候大家可能就需要问了,这咋吃啊。。。难道让我自己配料么?

这便是是我们的矛盾了!客户需要的一盘已经配好料的火锅汤底,但是我们初期给用户的锅里面或许只有盐水,我们不可能把原料给客户,让客户自己配料。

那么回到我们的装饰器模式上来,用咱们吃火锅的术语来解释下,把原先给客户的盐水锅底加上配料,使之成为客户需要的全辣火锅底料。

现在,我们就用代码来实现这个装饰的过程。

前序,我们先定义出一个抽象类,这个抽象类叫食料类,他里面有个方法叫入锅。

/**
 * 食料Food
 * @author
 *
 */
public abstract class Food {
	//食料有一个抽象方法,叫入锅,请原谅,我的英文就那么回事了,用拼音把。
	abstract public void ruguo();
}

再来一口锅

public class Guo {
	Food food;

	//定义一个煮的方法,煮的对象是食物
	public void zhu(Food food){
		this.food = food;
		food.ruguo();
		System.out.print("开锅开吃");
	}

}

下面,我们开始配料吧。

第一步,我们线在火锅内加入盐水

为了区分,我们在命名后面加上一个代表是被装饰者

public class Shui extends Food {

	@Override
	public void ruguo() {
		System.out.println("在锅里加入2升盐水");
	}

}

第二步,该加入配料了,同样配料也属于食料这个抽象类。

先在盐水里加入辣椒呗,这里要注意,辣椒属于一个装饰对象,必须要需要一个相同类型的被装饰对象,如果没有被装饰的对象,辣椒的单独存在就没有任何意义。下同

public class Lajiao extends Food {

	Food food;
	Lajiao(Food food){
		this.food=food;
	}
	@Override
	public void ruguo() {
		food.ruguo();
		System.out.println("在锅里加入3个辣椒");
	}

}

再加点大蒜

public class Dasuan extends Food {

	Food food;
	Dasuan(Food food){
		this.food=food;
	}
	@Override
	public void ruguo() {
		food.ruguo();
		System.out.println("在锅里加入2片大蒜");
	}

}

加点香料吧,放几个八角茴香

public class Huixiang extends Food {

	Food food;
	Huixiang(Food food){
		this.food=food;
	}
	@Override
	public void ruguo() {
		food.ruguo();
		System.out.println("在锅里加入5片茴香");
	}

}

暂时先加这几个吧。

好,我们来测试下,开锅

public class Tset {

	public static void main(String[] args) {
		//先来一口锅
		Guo guo = new Guo();

		//先准备一锅盐水--------->被装饰的对象
		Food shui = new Shui();

		//将辣椒放入盐水中------------->装饰器
		Food lajiao = new Lajiao(shui);

		//将大蒜加入辣椒盐水中---------->装饰器
		Food dasuan = new Dasuan(lajiao);

		//将茴香加入大蒜辣椒盐水中------->装饰器
		Food huixiang = new Huixiang(dasuan);

		//统一放入锅中,开煮

		guo.zhu(huixiang);

	}

}

运行结果:

好了,顺利开吃。。这样一锅火锅就煮好了。。。。

写好这样的代码之后,其实我们会发现,面向对象的思想会让我们代码如此的灵活。

假如我们不需要吃全辣火锅,只需要不加入辣椒即可。。。。

如果我们要吃干锅牛蛙,只需要再准备一个干锅牛蛙的适配器即可。。。

写到这,我突然发现,原来面向的思想在我们的生活如此的随处可见,一个厨师很简单的配菜过程就是一个装饰器的模式体现,是不是这或许也是JAVA那么受到欢迎的原因?

好了,又到了总结的时刻了。。。

适配器模式到底是什么?说白了就是一句话,给原有的对象随心所欲的添加你需要的功能。

但是适配器模式又需要满足几个原则。

1.身为装饰器必须要去装饰一个对象,就像我们上面提到的这些配料,离开了盐水其实一点意义都没有!

2.装饰器和被装饰的对象必须继承实现同一个接口或者继承于同一个抽象类。就如同我们的盐水,配料都需要实现放入火锅这个方法,当然啦,怎么样放入由他们自己去实现。就如同水要2升,大蒜只需要3片一样。

适配器和装饰器的区别?

写到这,我突然感觉装饰器和适配器有些分不清。。。。。

适配器是一个单独的类,是一个中间件,兼容老的接口,实现新的接口。同时对两方面负责。适配器瞻前顾后。

适应的场景,如原有传一个参数可以获取数据,现在需要两个参数才能获取到数据了。

有些人可能会说,直接重载原有类的方法不就行了吗?

记住,我们在开发中可能是调用他人的包或者他人的方法,而开发时候的原则应该是不能随意的修改他人的类,这时候我们开发一个适配器的类是最为适合不过的了。

而装饰器,顾前不顾后。

丰富原有方法事原有的方法更加能符合客户的需要。但是要保证原有的方法也正常使用。

适应的场景,原有方法A打印出客户的姓名。新方法要打印客户的姓名和性别。这时候我们可以用新建一个装饰器,在打印完姓名之后再新增打印性别的代码。

但是不管是什么样的设计模式,总有一个原则。

对内修改关闭,对外扩展开发

本文原创哦,需要转载请注明出处,谢谢各位了。

时间: 2024-10-10 15:47:12

菜鸟版JAVA设计模式—从火锅底料到装饰器模式的相关文章

菜鸟版JAVA设计模式-从抽象与实现说桥接模式

桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥接? 嗯,桥接!先把桥字换成连字,连接?桥接?桥接和连接最大的不同是桥接是降具有同样模式的两种事物连接起来,这是我依据词典的解释得出的. 好吧,具有同样模式,瞬间便想到了接口,是不是有职业病? 将抽象部分与实现部分分离,使它们都能够独立的变化. --<设计模式>GOF 再结合GOF的设计模式说明,

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式. 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清. 今天再重新学习下,把学习心得分享给大家一下.这次是结合的我工作中的实际项目. 设计模式,其实是一种解决方法,JAVA作为一种面向对象的语言,对于所有的设计模式在实现上,总是少不了对接口的实现,对抽象类的继承,有时候似乎是为了去实现接口而去写接口,所以在这三种模式的说明代码中,我们都定义了接口这些东西,所以才有了现在的混淆. 先不厌其烦的介绍

设计模式(三):装饰器模式

一.概述 装饰器模式动态地将责任附加到对象上.想要扩展功能,装饰者提供了有别于继承的另一种选择.简单描述就是包装对象,让对象提供新的行为. 二.解决问题 当一个类想要获得一个行为,我们会想到面向对象四大特性之一的继承,继承能够让子类从父类中获得行为,实现很好的代码复用.但这种继承而来的行为是在编译时静态决定的,而且所有的子类都会继承相同的行为.如果我们想要扩展对象的行为,就要创建一个子类来修改父类的方法(也就是覆盖父类行为),每扩展一个行为就要创建一个子类,这样会带来很多问题.第一,如果需要扩展

菜鸟版JAVA设计模式—外观模式

外观模式是一种比较容易理解的模式,作用很简单,就是解耦合. 结构也是非常简单,一个外观类,这个外观类持有很多的业务类. 再由客户类去调用这个外观类去实现一些列的业务操作... 这个模式在我们的工作中非常常见,一般来说,我们的项目都是分成了Action(conlller)层,service层,dao层.. dao层负责与数据库交互,service层负责调用dao层的数据库操作,一般来说一张表对应一个dao,在一个serice层代码中,可以不止有单独的对某一张表,所以可能调用多个dao进行业务操纵,

菜鸟版JAVA设计模式—从买房子看代理模式

今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比较好理解,代替去做就是代理. 比如,我们买卖房子,那么我们会找中介,我要卖房子,但是我们没有时间去卖,我主动交给中介,中介会帮我发布,会帮我找买家,带买家看房,最后我只要收到钱就行了. 买家的目的:卖房拿钱..卖加最终的目的就是把房子换成钱. 中介的工作:收集房产信息,发布房产信息,等买家打电话来,带买家看房,买家看中了,付钱给中介,中介办理过户手续,过户成功,抽掉自己的佣金,付钱给卖家. 卖家

设计模式总结篇系列:装饰器模式(Decorator)

在面向对象设计过程中,经常会遇到需要对现有的类的功能进行扩展,通常我们可以采用继承的方式.例如老罗最近在做手机,一开始需要定义手机所应具有的功能: 1 interface Phone{ 2 3 public void tel(); 4 5 public void sms(); 6 7 } 在此,为简单起见,只是定义了接打电话和收发短信功能. 然后,老罗开始造手机,经过两年艰苦努力,第一代手机T1终于面世了,很高兴的开了发布会,反响还不错. 1 class T1 implements Phone{

Java设计模式(四) 装饰器模式 代理器模式

(七)装饰器模式 Decorator 装饰器模式是为了动态的给一个对象增加一些新功能.装饰对象与被装饰的对象需要实现同一个接口,装饰对象持有被装饰对象的实例. interface DecoratorSourceable{ public void method(); } //被装饰类 class DecoratorSource implements DecoratorSourceable{ public void method(){ System.out.println("Source"

java设计模式之 装饰器模式

适AT java设计模式之 装饰器模式 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,动态给一个对象添提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.模拟一个人从想吃饭.找饭店.享受美食.结束吃饭的过程 代码展示: 首先创建一个被修饰的接口 Eat package deco

Java常用的设计模式07:常用设计模式之装饰器模式

1. Java之装饰器模式(Decorator Pattern) (1)概述:     装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原类文件和使用继承的情况下,动态    地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.     装饰者模式:动态地给一个对象添加一些额外的职责,就像在墙上刷油漆一样.就增加功能来说,Decorator模式比生成子类更为灵活. Decorator模式的工作原理是:可以创建始