zoukankan      html  css  js  c++  java
  • 设计模式笔记3(装饰者模式)

    这次笔记是对装饰者模式的学习,书中用到的例子是startbuzz店的订单系统,对于每一种产品,都需要有一个价格方法。现在面临的问题是用户的咖啡可能很复杂,同一种咖啡也可能由于用户添加新的材料而引起价格的变动,总不能把所有的可能情况都设计成类,显然这是不现实的。

    考虑了集中方案后都不太合适,继续阅读。

    继承和组合:继承威力强大,但是使用继承的话设计的类弹性较差,维护困难。通过组合也可以起到在运行时具有继承行为的效果。前面的内容已经介绍过。这两种方式的区别在于,继承的话子类行为在编译的时候已经决定了,而且子类会有相同的方法,而使用组合则是在运行时动态的扩展,显然它的效果会好。

    设计原则:类应该对扩展开放,对修改关闭

    这样能达到的目的就是类容易扩展,在不修改代码的情况下,可以搭配新的行为。

    采用装饰者模型,一层层的嵌入价格来达到目的。相当于把对象作为一个容器,任何一个对象都可以放入到另一对象中,允许嵌套。

    利用装饰者模式实现系统:

    ///最顶层的类,通过它可以可以达到类型匹配的目的,而不是由子类来继承它的行为。用接口也可以起到同样的效果

    public abstract class Beverage{

       String description="";

       public string getDescription()

    {}

    public abstract double cost()

    {

    }

    }

    //装饰者类,通过它来进一步定义各个装饰者

    public abstract class CondimentDecrator extends Beverage

    {

    public abstract String getDescription(){};

    }

    //实现一些饮料类

    public class Espresso extends Beverage

    {

       public Espresso()

    {

    description="Espresso";

    }

    }

    。。。。。。。。。。。

    实现一些装饰者

    public class Mocha extends CondimentDecorator

    {

    Beverage beverage;

    public Mocha(Beverage beverage)//注意参数类型

    {

       this.beverage=beverage;

    }

    public String getDescription()

    {

       return berverage.description+"Mocha";

    }

    public double cost()

    {

    return .20+beverage.cost();

    }

    }

    。。。。。。。。

    使用的时候代码如下:

    Beverage beverage =new Espresso();

    beverage=new Mocha(berverage);

    bererage=new Mocha(berverage);\

    如果对咖啡不是很了解的话,可以这样理解,要了一杯Espresso,加了两次的Mocha

    每次都放到一个杯子里,这样就把各个装饰者添加到了一块,注意代码的具体实现。

    Java的io系统设计就是使用了装饰者模型来设计的,可以仔细研究下。

    这次就到这里吧,比较粗糙这次,反思下,再有感悟补上吧。

  • 相关阅读:
    poj 3666 Making the Grade
    poj 3186 Treats for the Cows (区间dp)
    hdu 1074 Doing Homework(状压)
    CodeForces 489C Given Length and Sum of Digits...
    CodeForces 163A Substring and Subsequence
    CodeForces 366C Dima and Salad
    CodeForces 180C Letter
    CodeForces
    hdu 2859 Phalanx
    socket接收大数据流
  • 原文地址:https://www.cnblogs.com/macula7/p/1960690.html
Copyright © 2011-2022 走看看