设计模式 - 装饰者模式(Decorator Pattern) 具体解释

时间:2022-02-18 22:41:50

装饰者模式(Decorator Pattern) 具体解释

本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033

装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案.

用法:

1. 首先创建组件(Component)父类, 全部类,详细组件(Concrete Component)装饰者(Decorator)都属于这一类型,
能够进行扩展;

能够是抽象类(abstract class), 也能够是接口(interface);

代码:

/**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public abstract class Beverage {
String description = "Unkown Beverage"; public String getDescription() {
return description;
} public abstract double cost();
}

2. 装饰者(Decorator)类父类, 继承组件(component)父类, 可是不要实现接口函数, 由它的继承类(详细的装饰者)去实现,

能够是抽象类(abstract class),
也能够是接口(interface);

代码:

/**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription(); }

3. 详细组件(Concrete Component), 即装饰者(Decorator)须要装饰的基础, 继承组件(Component)父类;

代码:

/**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class DarkRoast extends Beverage { public DarkRoast() {
description = "Dark Roast";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.99;
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Decat extends Beverage { public Decat() {
description = "Decat";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 1.05;
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Espresso extends Beverage { public Espresso() {
description = "Espresso";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 1.99;
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class HouseBlend extends Beverage { public HouseBlend() {
description = "House Blend Coffee";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return .89;
} }

4. 装饰者(Decorator)类继承装饰者父类, 实现组件父类的接口装饰者父类的接口.

代码:

/**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Milk extends CondimentDecorator { Beverage beverage; public Milk(Beverage beverage) {
this.beverage = beverage;
} /* (non-Javadoc)
* @see decorator.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", Milk";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.10 + beverage.cost();
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Mocha extends CondimentDecorator { Beverage beverage; public Mocha(Beverage beverage) {
this.beverage = beverage;
} /* (non-Javadoc)
* @see decorator.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", Mocha";
} @Override
public double cost() {
// TODO Auto-generated method stub
return 0.20+beverage.cost();
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage) {
this.beverage = beverage;
} /* (non-Javadoc)
* @see decorator.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", Soy";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.15 + beverage.cost();
} } /**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) {
this.beverage = beverage;
} /* (non-Javadoc)
* @see decorator.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
// TODO Auto-generated method stub
return beverage.getDescription() + ", Whip";
} /* (non-Javadoc)
* @see decorator.Beverage#cost()
*/
@Override
public double cost() {
// TODO Auto-generated method stub
return 0.10 + beverage.cost();
} }

5. 測试, 创建详细组件(Concrete Component), 再一层一层加入装饰者(Decorator)类, 能够实现动态的组合;

代码:

/**
* @time 2014年5月23日
*/
package decorator; /**
* @author C.L.Wang
*
*/
public class StarbuzzCoffee { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() +
" $" + beverage.cost()); Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() +
" $" + beverage2.cost()); Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() +
" $" + beverage3.cost());
} }

6. 输出:

Espresso $1.99
Dark Roast, Mocha, Mocha, Whip $1.49
House Blend Coffee, Soy, Mocha, Whip $1.34

面向对象的原则:

对扩展开发, 对改动关闭.

设计模式 - 装饰者模式(Decorator Pattern) 具体解释

设计模式 - 装饰者模式(Decorator Pattern) 具体解释的更多相关文章

  1. 浅谈设计模式--装饰者模式(Decorator Pattern)

    挖了设计模式这个坑,得继续填上.继续设计模式之路.这次讨论的模式,是 装饰者模式(Decorator Pattern) 装饰者模式,有时也叫包装者(Wrapper),主要用于静态或动态地为一个特定的对 ...

  2. 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 用法

    装饰者模式(Decorator Pattern) Java的IO类 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716 ...

  3. C#设计模式——装饰者模式(Decorator Pattern)

    一.例子在软件开发中,我们往往会想要给某一类对象增加不同的功能.比如要给汽车增加ESP.天窗或者定速巡航.如果利用继承来实现,就需要定义无数的类,Car,ESPCar,CCSCar,SunRoofCa ...

  4. 设计模式学习--装饰者模式(Decorator Pattern)

    概念: 装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性. 解决方案: 装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也也就是有 ...

  5. 大话设计模式--装饰者模式 Decorator -- C++实现实例

    1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活. 每个装饰对象的实现和如何使用这个对象分离,  每个装饰对象只关心自己的功能,不 ...

  6. 23种设计模式之装饰器模式(Decorator Pattern)

    装饰器模式(Decorator Pattern) 允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包 ...

  7. 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)

    在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...

  8. C#设计模式之装饰者模式(Decorator Pattern)

    1.概述 装饰者模式,英文名叫做Decorator Pattern.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 2 ...

  9. Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)

    导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了 ...

随机推荐

  1. MongoDB 分片管理

    在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分, ...

  2. dedecms购物车商品添加删除数量改变方式变成ajax

    简单的做了一下修改,模板用的它默认的模板,感觉之前全是表单提交很不爽用的 修改的相关文件:/plus/posttocar.php, /plus/car.php,/templets/plus/car.h ...

  3. 分享.net常见的内存泄露及解决方法

    分享.net常见的内存泄露及解决方法 关于内存泄漏的问题,之前也为大家介绍过,比如:<C++中内存泄漏的检测方法介绍>,是关于C++内存泄漏的.今天为大家介绍的是关于.NET内存泄漏的问题 ...

  4. android脚步---简单图片浏览器改变图像透明度

    图片浏览器调用ImageView的setAlpha方法来实现改变图片透明度. main.xml文件如下:三个按钮,两个imageview,,界面定义了两个ImageView,一个是显示局部图片的Ima ...

  5. iOS开发之MapKit

    1.概述 MapKit框架使用前提: 导入框架: 导入主头文件: #import <MapKit/MapKit.h> MapKit框架使用须知: MapKit框架中所有数据类型的前缀都是M ...

  6. E&colon;I Think I Need a Houseboat-poj

    E:I Think I Need a Houseboat 总时间限制:  1000ms 内存限制:  65536kB 描述 Fred Mapper is considering purchasing ...

  7. 每日冲刺报告-Day3

    敏捷冲刺每日报告--Day3 情况简介 今天的任务是把json处理函数加入到爬虫中,把搜索到的结果存到json文件里去. 任务进度 赵坤:在爬虫中加入了json处理的代码,解决了在控制台打印中文列表/ ...

  8. TensorFlow学习笔记(MNIST报错修正 适用Tensorflow1&period;3)

    在Tensorflow实战Google框架下的深度学习这本书的MNIST的图像识别例子中,每次都要报错   错误如下: Only call `sparse_softmax_cross_entropy_ ...

  9. Python3中的编码问题

    编码方式介绍 我们首先来熟悉一下常见的一些编码方式,按照时间轴来划分,共有以下几种编码方式(常见): ASCII编码方式:对127个常见字符进行编码,其中包含了10个阿拉伯数字,共52个大小写英文字母 ...

  10. Mac系统下MySql下载MySQL5&period;7及详细安装流程

    一.在浏览器当中输入以下地址 https://dev.mysql.com/downloads/mysql/    二.进入以下界面:直接点击下面位置 ,选择跳过登录 点过这后直接下载. 三.下载完成后 ...