Java设计模式——装饰者模式

原创 2016年06月02日 01:11:13

愉快的工作又开始了。Leader安排了一个新的任务,给一个酸奶店的点单软件增加新的功能。
这个程序的原来所有的酸奶都继承于奶酪类(Cheese)

public  abstract class Cheese {
public String name;
public String introduce(){
    return name;
} 
public abstract int price();

所有具体的酸奶继承奶酪类并重写价格price方法,以原味酸奶和宫廷酸奶为例:

public class Original extends Cheese{
    public Original() {
        name="Original";
    }
@Override
    public int  price() {
    return 10;
    }
}
public class Court  extends Cheese{
    public Court() {
        name="Court";
    }
    @Override
    public int price() {
        return 8;
    }
}

这样的话直接调用实现类的introduce和price就可以得到名字和价格了。
但是随着酸奶店的规模越来越大,品种也越来越多,出现了一些新的品种的酸奶和配料,比如:草莓,奥利奥,樱桃。这些配料和酸奶进行搭配然后计算总共的价格和名称。
稍微思考一下,可能会有人选择这样写代码,以原味酸奶加草莓为例:

public class OriginalStrawberry extends Cheese{
    public Original() {
        name="OriginalStrawberry ";
    }
    @Override
    public int  price() {
    return 10;
    }
}

这样看起来,似乎并没有什么不妥,但是仔细想一想,酸奶加配料这样的组合有多少种可能呢?如果每一种可能都要写出来一个类的话,那么简直要类爆炸,并且如果任何一个酸奶或者配料更改了价格的话,那么所有关联类都需要修改,如果顾客想要双倍的草莓呢?或者草莓加樱桃呢?这样写下去简直是反人类的方法。
设计原则之一:类应该对扩展开发,对修改关闭。比如说对于一些我们经过测试没有问题的代码,原则上不应该修改源代码,而应该在源代码基础之上进行扩展。
如果我们这样设计代码是不是更好一点,还是以原味酸奶加草莓为例:我们先把一杯原味酸奶作为主体(被修饰者),用草莓作为修饰者修饰主体。就是先得到一个原味酸奶的对象,用草莓对象修饰它,然后调用price方法将草莓的价钱加上去。
这样的做法可以动态的将奶酪和配料松耦合的搭配在一起。所以先把系统分为奶酪和配料两个部分。

public abstract class Batching extends Cheese {
    public abstract String introduce();
}

草莓的实现类如下:

public class Strawberry extends Batching {
 Cheese cheese;

    public Strawberry(Cheese cheese) {
    this.cheese = cheese;
}

    @Override
    public int price() {
        return(cheese.price()+2);
    }

    @Override
    public String introduce() {
        return(cheese.introduce()+",Strawberry");
    }

}

樱桃的实现类如下:

public class Cherry extends Batching{
     Cheese cheese;

    public Cherry(Cheese cheese) {
        this.cheese = cheese;
    }

    @Override
    public String introduce() {
        return cheese.introduce()+"Cherry";
    }

    @Override
    public int price() {
        return cheese.price()+3;
    }

}

以原味酸奶加草莓为例:

public class Test {
    public static void main(String[] a){
     Cheese cheese=new Original();
     cheese =new Strawberry(cheese);
     System.out.println(cheese.introduce()+cheese.price());
 }
}

输出结果:Original,Strawberry12

Java:一夜一发设计模式(一)------装饰者模式

一,什么时候使用装饰者模式?比如有一家店卖饮品,饮品就有不少种,每一种还可以加项,比如给可乐加冰,加糖,兑水什么的,每次加项的价格还不同,就会将代码弄的很繁琐,这种情况下就可以使用装饰者模式来实现. ...
  • android_zyf
  • android_zyf
  • 2017年03月30日 01:53
  • 588

Java 设计模式 装饰者模式

装饰者模式 在设计的时候,往往要给一个对象的功能进行一些修饰,对功能进行拓展和增强,以满足我们的需求。    举个例子,最近流行歌曲比赛,什么《中国好声音》,《中国好歌曲》什么的,对于一个参赛者而言...
  • u010349169
  • u010349169
  • 2014年02月09日 23:57
  • 5849

学习、探究Java设计模式——装饰者模式

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满...
  • a553181867
  • a553181867
  • 2016年08月03日 22:52
  • 4422

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014年04月01日 09:07
  • 76545

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承关系的类:Father、Son、GrandSon,我们要在Son类上增强一些功能怎么办...
  • chs0113
  • chs0113
  • 2016年05月06日 19:42
  • 7838

设计模式 装饰者模式 带你重回传奇世界

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。 装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。 先简单描述下装饰者模式发挥作用的地方,当我...
  • lmj623565791
  • lmj623565791
  • 2014年04月21日 20:21
  • 17634

我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)

解决的问题: 我们在装饰新家的时候买了几幅抽象画,买回来之后发现有些加上色彩艳丽的边框更适合我们,而有的加上玻璃罩之后更能符合我们的使用。那我们来怎么解决这个问题呢?他需要动态的给别的对象增加额...
  • tanningzhong
  • tanningzhong
  • 2015年01月24日 14:47
  • 570

设计模式——装饰者模式 Java源代码

装饰者模式,可以动态地把职责附加到已有的对象上面去。又称 Wrapper Pattern,在代码实现的时候,确实有“包装”的意思。...
  • u013390476
  • u013390476
  • 2016年01月20日 19:34
  • 1098

简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 15:34
  • 1020

设计模式学习之装饰模式:IO流的装饰器

IO流的装饰器 题目分析:通过对java的io系列类分析得知,java的io流使用了设计模式中的装饰模式,以动态的给一个对象增加职责,能够更加灵活的增加功能。通过看io的源代码得知FilterOut...
  • u014293306
  • u014293306
  • 2015年06月23日 14:07
  • 1418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式——装饰者模式
举报原因:
原因补充:

(最多只允许输入30个字)