Java设计模式(装饰者模式)

不同的穿衣打扮可以让一个人显示出不同的气质,这就好比我们编程中的装饰设计模式一样,进行不同的装饰后可以出现不同的产品对象,下来就让我们看看装饰模式到底是怎么用的吧。
首先介绍一下装饰模式到底是什么吧,其实装饰模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,这正好遵循了我们程序设计的开闭原则。

先说这样一个需求吧,假设咖啡馆需要你编写程序计算咖啡的价格,这样的要求看似是很简单的,可是一细想你会发现咖啡中可以加入这样活那样的料,这样就需要在原有的价格上进行累加,可是这样一来,如果有多种料需要进行不同的搭配,如果采用普通的方法进行累加求和,那是一件让人很崩溃的事。恰恰装饰者模式就是在这种情况下发挥着巨大的作用了,我们来看看吧!

首先我们需要先定义一个所有咖啡的抽象类Beverage
public abstract class Beverage {


	String description = "unknow Beverage";


	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
	
}

Beverage类很简单,接下来我们需要Comdiment(调料)了,也就是我们对Beverage的装饰了,也就是装饰者抽象类CondimentDecorator
public abstract class CondimentDecorator extends Beverage {


	public abstract String getDescription();


}
好了基本的都写好了,我们来写几个具体的咖啡实现类吧

先写一个浓缩咖啡Espresso
public class Espresso extends Beverage {


	@Override
	public double cost() {
		return 1.99;
	}


	public Espresso() {
		description = "Espresso";
	}
}

混合黑咖啡
public class HouseBlend extends Beverage {


	@Override
	public double cost() {
		return .89;
	}


	public HouseBlend() {
		description = "House Blend Coffee";
	}
}

再来几个装饰者吧,先来个摩卡(Mocha)吧
public class Mocha extends CondimentDecorator {


	Beverage beverage;
	
	public Mocha(Beverage beverage) {
		this.beverage = beverage;
	}


	@Override
	public String getDescription() {
		return this.beverage.getDescription() + ", Mocha";
	}


	@Override
	public double cost() {
		return .20 + this.beverage.cost();
	}


}

装饰者Soy
public class Soy extends CondimentDecorator {


	Beverage beverage;
	
	public Soy(Beverage beverage) {
		this.beverage = beverage;
	}


	@Override
	public String getDescription() {
		return this.beverage.getDescription() + ", Soy";
	}


	@Override
	public double cost() {
		return .10 + this.beverage.cost();
	}


}

装饰者Whip
public class Whip extends CondimentDecorator {


	Beverage beverage;
	
	public Whip(Beverage beverage) {
		this.beverage = beverage;
	}


	@Override
	public String getDescription() {
		return this.beverage.getDescription() + ", Whip";
	}


	@Override
	public double cost() {
		return .30 + this.beverage.cost();
	}


}

好了,我们的被装饰的对象和装饰者都已经写好了,我们来测试一下吧
public class Test {
	public static void main(String[] args) {
		//定义Espresso,不加调料,打印描述价格
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + ", $" + beverage.cost());
		
		//定义House Blend,两份摩卡,一份Soy和Whip
		Beverage beverage2 = new HouseBlend();
		beverage2 = new Mocha(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Soy(beverage2);
		beverage2 = new Whip(beverage2);
		System.out.println(beverage2.getDescription() + ", $" + beverage2.cost());
	}
}
运行看看结果吧:
Espresso, $1.99
House Blend Coffee, Mocha, Mocha, Soy, Whip, $1.69


这样以后随便加入调料,我们直接扩展就行了,很方便吧,这就是我们的装饰者模式。

其实jdk自带的最常用的装饰者就是I/O,输入输出流进行各种装饰,比如:

DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("FileTest.Java")));
InputStream is = new BufferedInputStream(new FileInputStream(new File("")));
InputStream isis = new BufferedInputStream(new GZIPInputStream(new FileInputStream("")));

像这样就会产生像责任连一样的,一层层的装饰,这种模式利于扩展,好好学习研究吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值