7.太多-享元模式(Flyweight)+装饰模式(Decorator)
今天终于完成了所有科目的考试,心情没有想象中的那么高兴,只是考完而已,呵呵,哎,为什么呢,好像觉得自己越来越接近社会了,我突然好怀念大学,每天的上班下班让人觉得很烦恼似乎,我还记得很久以前,我很憧憬自己长大,然后成为很厉害的人,那时对于我来说最大的困难就是不能很快的长大,长大后什么问题都不是问题了,呵呵,我是一个很固执的人,很多东西我都很追求完美不愿放弃一点,但是社会的现实始终让我暂时低下了头,但是我知道我没有明白,我永远都不会明白,我就是没有达到目的不会放弃的人,就算一年,10年,一百年,我愿意付出这个代价,也许不值得,现在没有实现,是因为你还不够强大,所以你不能要求更多.
编程就是生活,算法也是生活,程序员也有喜怒哀乐,我愿意把它放到我的模式中展现出来。
享元模式(Flyweight):
刚开始对于这个新名词,一下子被他吓到了,我好想随便看看,然后就这样算了,当做是敷衍自己,但是我对自己又说,那你比不看还要糟糕,的确,在我前3年的时间中,我试过太多这样的事情了,面对困难,只是了解,从不敢深入探讨,只在乎和他人吹水,骗骗自己骗骗别人,告诉自己,这样的日子是尽头了,不真正弄懂,不罢休。
其实享元模式的基本实现是将可以复杂对象中不变的东西提取出来,作为静态,其他变得就传进去,这样就能将几百万的对象一下子就变成几个
内蕴状态:就是不变的部分
外蕴状态:就是变得部分咯
举一个非常简单的例子:一个咖啡摊的例子,在这个咖啡摊(Coffee Stall)所使用的系统里,有一系列的咖啡"风味(Flavor)"。客人到摊位上购买咖啡,所有的咖啡均放在台子上,客人自己拿到咖啡后就离开摊位。咖啡有内蕴状态,也就是咖啡的风味;咖啡没有环境因素,也就是说没有外蕴状态。如果系统为每一杯咖啡都创建一个独立的对象的话,那么就需要创建出很多的细小对象来。这样就不如把咖啡按照种类(即"风味")划分,每一种风味的咖啡只创建一个对象,并实行共享。
使用咖啡摊主的语言来讲,所有的咖啡都可按"风味"划分成如Capucino、Espresso等,每一种风味的咖啡不论卖出多少杯,都是全同、不可分辨的。所谓共享,就是咖啡风味的共享,制造方法的共享等。因此,享元模式对咖啡摊来说,就意味着不需要为每一份单独调制。摊主可以在需要时,一次性地调制出足够一天出售的某一种风味的咖啡。
很显然,这里适合使用单纯享元模式。
咖啡屋的例子
在前面的咖啡摊项目里,由于没有供客人坐的桌子,所有的咖啡均没有环境的影响。换言之,咖啡仅有内蕴状态,也就是咖啡的种类,而没有外蕴状态。
下面考虑一个规模稍稍大一点的咖啡屋(Coffee Shop)项目。屋子里有很多的桌子供客人坐,系统除了需要提供咖啡的"风味"之外,还需要跟踪咖啡被送到哪一个桌位上,因此,咖啡就有了桌子作为外蕴状态。
由于外蕴状态的存在,没有外蕴状态的单纯享元模式不再符合要求。系统的设计可以利用有外蕴状态的单纯享元模式。
例子略
装饰模式(Decorator):
刚才享元模式解决的问题是太多对象了,那么现在装饰模式解决的是什么呢,就是太多类,Decorator 模式是指:用分层的对象(layered objects)动态地和透明地给单个对象添加功能(responsibilities)。其实书上的例子写的很好,我直接放上来吧,也很容易理解,不过关于如何实践,这还是需要一番理解。
一个关于咖啡的例子 考虑去当地的一家咖啡馆BeanMeUp 喝杯咖啡。那里通常会提供许多种不同的饮 料——蒸馏咖啡, lattes, 茶, 冰咖啡,热巧克力饮品,而且还有许多额外的添加 物,比如生奶油或者额外的蒸馏咖啡粉末(当然这些是要另外收钱的)。你也可以不 支付额外的费用而改变你的饮料,比如你可以要求把普通咖啡换成脱咖啡因咖啡。 有一点是非常清楚的,如果我们想给上面所有这些饮料和它们的组合建模,那将 会产生一张非常大的类图。为了能够清楚的说明问题,我们只考虑所有咖啡品种的一 个子集:Espresso, Espresso Con Panna, Café Late, Cappuccino and Café Mocha. 我们提供2 种额外的添加物——生奶油(“whipped”)和蒸馏咖啡粉,和三种可选择 的饮品——脱咖啡因咖啡,steamed milk ("wet") 和 foamed milk ("dry"). 每种组合对应一个类 一个解决办法是给每种组合都创建一个类。用它来描述每种饮料(的组成)和价 格等等。最终产生的饮料单是巨大的。你可以看到,创建你想要的组合是非常简单的,因为你只要创建某个类的一个实例就可以了。但是,这种方法存在许多问题。首先,这些组合都是静态固定死的,客户想要的每个组合都必须预先创建好。其次,整个组合生成的菜单实在是太大了,要找到某个特定的组合非常困难而且耗时。
Decorator 方法 另外可以采用把这些饮料拆成类似于esspresso 和foamed milk 的组件 (components),然后让顾客通过组合这些组件来描述某种特定的咖啡饮料。 我们使用Decorator 模式,通过编程来实现上述想法。Decorator 通过包裹 (wrapping)一个组件来给它增加功能,但是Decorator 兼容它所包裹的那个类的接 口,这样,对component 的包裹就是透明的。Decorator 自身又可以被(别的 Decorator)包裹而不丧失其透明性。
其实为你的对象添加一些衣服鞋子这样,代码太长了,不写了,没心情今天,
折衷(Compromise) 用上面这种方法来描述某种咖啡饮品实在是太冗长了。对于那些经常会被用到的 组合,如果用一种更快的方法来描述它们会方便很多。 这里的第三种方法就是前面两种方法的组合,也就是灵活性和易用性相结合。这 种折衷是通过创建合适大小的供常规选择的菜单来实现的,这个菜单基本上是不怎么 太多(Too many) 变化的,但是如果你想给这些基本饮品加点伴侣(比如whipped cream, decaf 等), 那你可以用decorators 来改变基本饮品。这其实也是大多数咖啡馆提供的那种菜单。
分享到:
相关推荐
**享元模式(Flyweight Pattern)** 运用共享技术有效地支持大量细粒度的对象。 **应用场景**:当系统中有大量相似对象时。 ##### 24. **备忘录模式(Memento Pattern)** 在不破坏封装性的前提下,捕获一个...
8. **装饰模式**(Decorator) - **模式名称**:装饰模式 - **问题**:需要动态地给一个对象添加职责。 - **解决方案**:通过动态地增加额外的行为来扩展对象的功能。 - **效果**:提供了比继承更灵活的扩展机制...
9. **享元模式(Flyweight)**:享元模式在Spring AOP中不太直接体现,但在Spring框架的其他部分,如缓存管理,可能会用到此模式来减少内存消耗,通过共享大量细粒度对象的内部状态来降低内存占用。 10. **代理模式...
设计模式之 Flyweight(共享元) 提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 ...
4. **其他模式**:除了以上三大类,还有一些跨类别或者不太常见的模式,如享元模式(Flyweight)用于减少创建对象的数量,状态模式(State)允许对象在其内部状态改变时改变其行为,访问者模式(Visitor)在不改变类...
9. 装饰模式(Decorator Pattern) 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的...
装饰模式(Decorator) 装饰模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。该模式通过在不改变现有对象的基础上,动态地给该对象...
享元模式(FLYWEIGHT) 享元模式用于减少对象的数量,通过共享技术达到更多复用。例如,当我们面对不同的MM时,可以准备一套通用的情话模板,然后根据具体情况稍作修改。 **享元模式的特点:** - **概念**:通过...
装饰器模式(Decorator Pattern)动态地给对象添加一些职责,如果要增加的功能太多,继承会导致类爆炸,此时装饰器模式就显得尤为重要。它允许我们独立于对象的其他部分来扩展其功能。 接下来是观察者模式...
- `Flyweight`:定义享元接口。 - `ConcreteFlyweight`:实现享元接口。 - `UnsharedConcreteFlyweight`:未被共享的具体享元类。 - `FlyweightFactory`:创建并管理享元对象。 **7. 代理模式** - **定义**:为...
享元模式(Flyweight) 享元模式运用共享技术有效地支持大量细粒度的对象。这种模式可以减少内存中的对象数量,从而提高性能和效率。 **应用场景**: - 系统中有大量相似的对象。 - 这些对象消耗大量的内存资源。...
享元模式(Flyweight Pattern)** - **定义**:运用共享技术有效地支持大量细粒度的对象。 - **应用场景**:系统中有大量的相同或相似的对象,由于这类对象的大量使用,造成内存的大量耗费;对象的大多数状态都...
享元模式 (Flyweight) 享元模式是一种结构型设计模式,它用来减少创建大量相似对象所消耗的内存。通过共享尽可能多的数据来达到最大化内存利用率。 **有趣见解:** 享元模式主要用于减少内存占用。它通过共享对象...
3 装饰者模式:装饰对象 4 工厂模式:烘烤OO的精华 5 单件模式:独一无二的对象 6 命令模式:封装调用 7 适配器模式与外观模式:随遇而安 8 模板方法模式:封装算法 9 送代器与组合模式:管理良好的...
装饰模式与继承关系的目的都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。 8、代理模式(Proxy) 代理模式为其他对象提供一种代理以控制对这个对象的访问。代理模式能够协调调用者和被调用者,在...
9. **装饰模式(Decorator)** - **概念**:动态地给一个对象添加一些额外的职责。 - **应用场景**:扩展功能,动态增强功能。 - **优缺点**:优点是增强了代码的灵活性;缺点是产生大量的小对象,增加了系统...
4. 享元模式(Flyweight Pattern):使用对象池来减少重复对象的创建。优点:大大减少对象的创建,降低系统的内存,使重复利用率提高,减少对象数量从而改善应用所需的对象结构的方式;缺点:虽然降低内存的使用,...
#### 第13章:装饰模式【DECORATOR PATTERN】 **定义与作用:** 装饰模式动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式相比生成子类更为灵活。 **实现原理:** - 定义一个组件接口,定义原始对象...