JAVA设计模式之装饰模式

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

例子:你要替一家咖啡店设计beverage类。beverage有很多种,并且可以添加许多的调料,比如蒸奶、豆浆、摩卡等。

 1 public abstract class Beverage
 2 {
 3     String description = "Unknown Beverage";
 4
 5     public String getDescription()
 6     {
 7         return description;
 8     }
 9
10     public abstract double cost();
11 }
12
13 public class Espresso extends Beverage
14 {
15     public Espresso()
16     {
17         description = "Espresso";
18     }
19
20     @Override
21     public double cost()
22     {
23         return 1.99;
24     }
25 }
26
27 public abstract class CondimentDecorator extends Beverage
28 {
29     public abstract String getDescription();
30 }
31
32 public class Mocha extends CondimentDecorator
33 {
34     Beverage beverage;
35
36     Mocha(Beverage beverage)
37     {
38         this.beverage = beverage;
39     }
40
41     @Override
42     public String getDescription()
43     {
44         return beverage.getDescription() + ", Mocha";
45     }
46
47     @Override
48     public double cost()
49     {
50         return .20 + beverage.cost();
51     }
52 }
53
54 public class Whip extends CondimentDecorator
55 {
56     Beverage beverage;
57
58     Whip(Beverage beverage)
59     {
60         this.beverage = beverage;
61     }
62
63     @Override
64     public String getDescription()
65     {
66         return beverage.getDescription() + ", Whip";
67     }
68
69     @Override
70     public double cost()
71     {
72         return .35 + beverage.cost();
73     }
74 }
75
76 public class test
77 {
78     public static void main(String[] args)
79     {
80         Beverage espresso = new Espresso();
81         Beverage espresso_mocha = new Mocha(espresso);
82         Beverage espresso_mocha_whip = new Whip(espresso_mocha);
83         output(espresso_mocha_whip);
84     }
85
86     public static void output(Beverage beverage)
87     {
88         System.out.println(beverage.getDescription() + " $: " + beverage.cost());
89     }
90 }

注:JAVA I/O中利用了装饰模式。

时间: 2024-12-11 13:21:57

JAVA设计模式之装饰模式的相关文章

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

JAVA设计模式:装饰模式

前面我们学习了代理模式: 代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清楚得很,同样一个接口. 本次我们学习下装饰模式: 装饰模式又称为包装模式,装饰模式以对客户端透明的方式扩展对象功能,相对于代理而言,代理是不让客户端知道真实对象的信息,装饰模式是基层关系的一个替代方案. 装饰模式是采用对客户端透明的方式动态的给一个对象添加了更多职责,对于原来被装

Java——设计模式(装饰模式_IO)

 /* * 装饰设计模式: *  对一组对象的功能进行增强时,就能够使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点:  就是进行功能的扩转增强. * */ public class TestIO4 { public static void main(String[] args) { Person p = new Person(); NewPerson np = new NewPerson(p); np.chifan();//使用增强后的功能. } } //原有的类 class 

浅谈JAVA设计模式之——装饰模式(Decorator)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45464445 一.概述 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 二.适用性 1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 2.处理那些可以撤消的职责. 3.当不能采用生成子类的方法进行扩充时. 三.参与者 1.Component 定义一个对象接口,可以给这些对象动态地添加职责. 2.Concrete

java设计模式(1)-------单例,工厂,值对象,装饰模式

      java设计模式(1) 先简单的介绍下设计模式吧:是一种解决问题的一种行之有效的思想:用于解决特定环境下.重复出现的特定问题的解决方案. 那为什么我们需要学习设计模式呢? 1.设计模式都是一些相对优秀的解决方案,很多问题都是典型的.有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可,站的高看到远,就是要站在巨人的肩膀上把他们踩下去,嘿嘿. 2.设计模式已经成为专业人士的常用词汇,不懂不利于交流,能让你变得很牛逼哦. 3.能让你设计的

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

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

Java设计模式学习记录-装饰模式

前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方都运用了装饰模式. 装饰模式 定义 装饰模式的定义是:在不改变原类文件以及不使用继承的情况下,动态的扩展一个对象的功能.装饰模式是通过创建一个包装对象来实现的,也就是用装饰来包裹真实的对象. 举例 还是老规矩,举例说明,在给亲朋好友过生日时会买生日蛋糕,然后生日蛋糕又有

Java设计模式之认识阶段

设计模式是什么? 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 其本质就是继承与接口的组合应用. 为什么要用设计模? 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.提高工作效率. 设计模式的分类: 设计模式按目的可分为三种类型,共23种. 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 行为型模式:模版

java设计模式演示样例

创建模式 1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式. public class TestFactoryMethod { public static void main(String[] args) { AnimalFactory af=new DogFactory(); Animal1 a=af.getAnima