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设计模式之 —— 装饰者(Decorator) — 点炒饭

Java设计模式之 —— 装饰者(Decorator) — 做炒饭下面会用做炒饭的例子来描述一下装饰者设计模式,装饰者设计模式比较适合用于拓展功能,我要做炒饭,最简单的就是油盐加米饭就可以做出炒饭,但...

java设计模式——装饰者模式Decorator

java设计模式——装饰者模式装饰模式又名包装(Wrapper)模式。装饰者模式是对已经实现功能的扩展,在原有功能添加新的功能,用来解决子类爆炸问题。...

java设计模式——装饰者模式浅析

帮同学做试卷发现有个编程题居然让用Decorator来写,以前只接触过简单的设计模式,现在有时间准备好好认真学习一下设计模式。如果你只会code那么你永远都只是code,如果你会设计模式和算法那么你绝...

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

装饰者模式 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为。行为来自装饰者和基础组件,或与...
  • cai1213
  • cai1213
  • 2012年09月21日 11:51
  • 12130

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

装饰者模式,可以动态地把职责附加到已有的对象上面去。又称 Wrapper Pattern,在代码实现的时候,确实有“包装”的意思。...

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

我们都知道,可以使用两种方式给一个类或者对象添加行为。         一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但...

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

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

【Java设计模式06】——装饰者模式

转载:http://blog.csdn.net/xu__cg/article/details/53024490 装饰者(Decorate)模式又称为包装(Wrapper)模式。 装饰者模式...

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

本章可以称为“给爱用继承的人一个全新的设计眼界”。我们即将再度探讨典型滥用问题。你将在本章学到如何使用对象组合的方式,做到在运行时装饰类。为什么呢?一旦你熟悉了装饰者的技巧,你将能够在不修改任何底层代...

java设计模式之二 —— 装饰者模式整理

先整理下装饰者模式的基本概念: 装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户端透明的方...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式——装饰者模式
举报原因:
原因补充:

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