Java设计模式(三)-修饰模式
我们都知道。能够使用两种方式给一个类或者对象加入行为。
一是使用继承。继承是给一个类加入行为的比較有效的途径。通过使用继承,能够使得子类在拥有自身方法的同一时候,还能够拥有父类的方法。可是使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制添加行为的方式和时机。
二是使用关联。组合即将一个对象嵌入到还有一个对象中,由还有一个对象来决定是否引用该对象来扩展自己的行为。
这是一种动态的方式,我们能够在应用程序中动态的控制。
与继承相比,关联关系的优势就在于不会破坏类的封装性,且具有较好的松耦合性,能够使系统更加easy维护。可是它的缺点就在于要创建比继承很多其它的对象
一、装饰者的定义:
装饰着模式动态的将责任附加到对象上,若想要扩展功能,装饰着提供比继承更有弹性的替代方案。
二、装饰着模式的UML图:
Compoent类:抽象类,每一个组件能够单独使用它。或者包装起来使用
ConcreteCompoent类:动态载入新行为的对象。继承于Compoent
Decorator类:装饰着共同实现的接口,能够使抽象类
ConcreteDecorator1、ConcreteDecorator2类:装饰实例,装饰者包着Compent
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3NoaXJkZXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
三、应用场景:
Startbuzz是以扩张速度最快的的咖啡连锁店。由于扩张太快。他们准备更新订单系统。以供应需求。他们原先的设计是这种。
购买咖啡时,能够要求在当中增加各种调料。比如:牛奶(Milk)、豆浆(Soy)、摩卡(Mocha)。Startbuzz会依据不同的调料收取不同的费用,所以订单必须考虑到调料部分。。
这是他们的第一次尝试。。。
解决方式:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3NoaXJkZXk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
四、编写代码
Compotemt:Beverage类
//@file:beverage.java
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
ConcreteCompotemt:Espresso类
//浓缩咖啡
//@file:Espresso.java
public class Espresso extends Beverage {
<span style="white-space:pre"> </span>public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1;
}
}
CondimentDecorator:HouseBlend类
//@file:HouseBlend.java 、
//深烤烘焙
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "HouseBlend";
}
@Override
public double cost() {
return 0.5;
}
}
Decorator:CondimentDecorator类
//@file:CondimentDecorator.java
public abstract class CondimentDecorator extends Beverage{
abstract public String getDescription();
}
ConcreteDecorator:Milk类
//file:Milk.java 牛奶味道的调料
public class Milk extends CondimentDecorator { Beverage beverage;
public Milk(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"-Milk";
}
@Override
public double cost() {
return beverage.cost()+2.0;
}
}
ConcreteDecorator:Mocha类
//摩卡味道的调料
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"-Mocha";
}
@Override
public double cost() {
return beverage.cost()+3.0;
}
}
ConcreteCDecorator:Soy类
//豆浆味道的调料
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"-Soy";
}
@Override
public double cost() {
return beverage.cost()+4.0;
}
}
開始下单啦!!!
public class OrderApp {
public static void main(String[] args) {
Beverage beverage1 = new HouseBlend();
beverage1 = new Milk(beverage1);
beverage1 = new Mocha(beverage1);
beverage1 = new Soy(beverage1);
System.out.println("beverage1 description:"+beverage1.getDescription()+"\ncost:"+beverage1.cost()); Beverage beverage2 = new Espresso();
beverage2= new Milk(beverage2);
beverage2 = new Mocha(beverage2);
System.out.println("beverage2 description:"+beverage2.getDescription()+"\ncost:"+beverage2.cost());
}
}
output:
beverage1 description:HouseBlend-Milk-Mocha-Soy
cost:9.5
beverage2 description:Espresso-Milk-Mocha
cost:6.0
版权声明:本文博主原创文章,博客,未经同意不得转载。
Java设计模式(三)-修饰模式的更多相关文章
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- java设计模式6--适配器模式(Adapter )
本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
随机推荐
- POJ3190 Stall Reservations 【贪婪】
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3106 Accepted: 111 ...
- java环境变量设置--编写一年java,竟不会配变量了
java环境变量设置 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Ja ...
- 在centos上部署java WEB环境
题语:偷得浮生半日闲,趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk 1. 使用Xftp 5把jdk-8u ...
- hdu3570, 超级简单的斜率优化dp
dp[i] = dp[j] + (a[i] - a[j])^2 + m;展开得 dp[i] = min{dp[j] + a[i]^2 + a[j]^2 - 2*a[i]*a[j] + m}其中a[i] ...
- 多线程——达到Runnable介面
部分博客(多线程--继承Thread类)介绍了java多线程的第一种实现方法--继承Thread类.这篇博客介绍另外一种方法--实现Runnable接口,并实现run方法. 还用上篇博客的样例.如今用 ...
- Dreamer 3.0 支持json、xml、文件上传
自己写的框架,功能类似Struts2.x 下载地址:http://pan.baidu.com/share/link?shareid=3273223286&uk=470382596 新增功能: ...
- Android:刚6瓶啤酒4两56度白酒下肚,竟然20分钟做了一手机版站点 !
刚6瓶啤酒4两56度白酒下肚,竟然20分钟不到时间做了一手机版站点 !人有多大潜力你知道吗? 大家有兴趣的能够用手机或微信打开 http://xh.yunxunmi.com/ 看看俺这酒后之做! 很 ...
- C 和 C++ 的速度相差多少,你知道吗?
有谁清楚这个事实吗 ? 网络游戏速度至关重要, 是游戏质量的唯一标准, 尤其是即时格斗, 相差几毫秒都会影响用户体验 ! 哪怕就是 5% 的效率损失,也是 差之毫厘,失之千里, 游戏的速度是程序语言天 ...
- 阿赫亚web安全JSON
前言 JSON(JavaScript Object Notation),可以说,这一事实,浏览器,server数据交换标准.的格式如XML,或者其他自己定义的格式会越来越少. 为什么JSON这么流行? ...
- WPF 3D:使用GeometryModel3D的BackMaterial
原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...