不同的穿衣打扮可以让一个人显示出不同的气质,这就好比我们编程中的装饰设计模式一样,进行不同的装饰后可以出现不同的产品对象,下来就让我们看看装饰模式到底是怎么用的吧。
首先介绍一下装饰模式到底是什么吧,其实装饰模式就是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,这正好遵循了我们程序设计的开闭原则。
先说这样一个需求吧,假设咖啡馆需要你编写程序计算咖啡的价格,这样的要求看似是很简单的,可是一细想你会发现咖啡中可以加入这样活那样的料,这样就需要在原有的价格上进行累加,可是这样一来,如果有多种料需要进行不同的搭配,如果采用普通的方法进行累加求和,那是一件让人很崩溃的事。恰恰装饰者模式就是在这种情况下发挥着巨大的作用了,我们来看看吧!
首先我们需要先定义一个所有咖啡的抽象类 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 {@Overridepublic double cost() {
- return 1.99;
- }
- public Espresso() {
- description = "Espresso";
- }
- }
混合黑咖啡
- public class HouseBlend extends Beverage {@Overridepublic 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;
- }@Overridepublic String getDescription() {
- return this.beverage.getDescription() + ", Mocha";
- }@Overridepublic double cost() {
- return.20 + this.beverage.cost();
- }
- }
装饰者 Soy
- public class Soy extends CondimentDecorator {
- Beverage beverage;
- public Soy(Beverage beverage) {
- this.beverage = beverage;
- }@Overridepublic String getDescription() {
- return this.beverage.getDescription() + ", Soy";
- }@Overridepublic double cost() {
- return.10 + this.beverage.cost();
- }
- }
装饰者 Whip
- public class Whip extends CondimentDecorator {
- Beverage beverage;
- public Whip(Beverage beverage) {
- this.beverage = beverage;
- }@Overridepublic String getDescription() {
- return this.beverage.getDescription() + ", Whip";
- }@Overridepublic 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和WhipBeverage 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.99House 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 就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: http://www.92to.com/bangong/2017/02-22/17393079.html