3- decorador patrón de diseño patrón

0. Orden

patrón de decoración -> composición de objetos de forma, en la decoración de tiempo de ejecución. Puede ser cualquiera sin modificar el código subyacente del objeto de impartir nuevas responsabilidades

1. Ejemplos cafetería

El problema: una superclase abstracta bebidas Bebidas, cuando demasiadas subcategorías, el surgimiento explosivo de la clase Complex

Aquí Insertar imagen Descripción
Obviamente, es difícil de mantener, la aparición de una nueva bebida que va a heredar la clase padre.

Un caso especial: un café doble espuma de leche, considerada una bebida, tres veces el café espuma de leche, ... la infinita variedad de bebidas apareció.

Se violó dos principios? ? ?

  • Programación orientada a lograr
  • Algunos de estos cambios no se tira hacia fuera, tal como se varía costo método ()

Principios: Desarrollo - cerrados (cambios) puede extenderse desde

Objetivo: para permitir una fácil extensión de la clase, sin modificar el código existente, se puede con el nuevo comportamiento.

OK, aquí por la sucesión de las bebidas anteriores: el número de explosión de clase, diseño rígido y difícil de mantener, y la función de la clase base no es adecuado para todas las subclases.

Cómo decoración patrón decorativo? Los clientes deben asumir Semple moka y espuma de leche de café para beber como el cuerpo principal, especias utilizar para decorar:

  • Tome una cultura del café profundo objetos DarkRoast (heredado de la bebida)

  • Mocha Mocha con objetos decorativos

  • Whip decorada con espuma de leche

  • método de coste de la llamada (), debe confiar en comisión (delegado) se sumará al precio de las especias

    Mi pregunta: ¿cómo decorar? Cómo delegar? Lo que está encargado?

    Sólo recuerdo patrón de flujos de entrada y de salida decorativos en el JDK es un patrón decorativo. Pero, ¿cómo lograr? Comprender fácil de entender: que se envuelve en capas de, pero se dio cuenta de lo que estaba pasando? Y, finalmente, la forma de calcular el precio total de café en esta decoración? ? ?

Aquí Insertar imagen Descripción
Ejemplos aquí son dependientes en el interior de los resultados de costes costo exteriores.

Obviamente **: ** Después de decorador puede decorar con el comportamiento previo de la persona que se encargó, con su propio comportamiento, para alcanzar un propósito específico. -> ¿Cómo lograr? ? ?

decorador decorador con la misma superclase. -> Para decorador decorador puede ser sustituido, polimórfico.

2. Definir el patrón decorador

Decorador dinámica del patrón las responsabilidades adjuntas al objeto. En la expansión, más flexible que la herencia.

Aquí Insertar imagen Descripción

diagrama de clases espectador Caffe para un ejemplo:

Aquí Insertar imagen Descripción

Obviamente: como bebida debe ser decoradores, especias tenían decoradores.

Ques: Desde la interfaz de programación orientado, por qué no ponen interfaz de bebidas diseñado, y lo manejan como una clase abstracta?

:( respuestas Ans en el libro) del programa inicial, la bebida es una clase abstracta, por lo general el patrón decorador es el uso de clases abstractas, las interfaces también se pueden utilizar. Sin embargo, para evitar ** modificar el código existente. ** Después de que todos cuantos problemas generales, código existente que puede crear nuevos problemas después de la modificación. . .

3. Código

En este capítulo se entiende bien en teoría comprender, pero no se había dado cuenta antes de que era un poco difícil de conseguir, que es escribir el código.

/**
 * 抽象基类
 */
public abstract class Beverage {
    protected String description="Unknown Beverage";//protected是子类可以访问 无 是 默认情况 同一个包下的类可以访问

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

el decorador

/**
 * 浓缩咖啡
 */
public class Espresso   extends Beverage {

    public Espresso() {
        description="Espresso--浓缩咖啡";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}
/**
 * 混合--黑咖啡
 */
public class HouseBlend extends Beverage {
    @Override
    public double cost() {
        return 0.89;
    }

    public HouseBlend() {
        description="house blend coffee";
    }
}

Decorador - una clase base abstracta

/**
 * 装饰类 --> 调料
 */
public abstract class Condiment extends Beverage {
    public abstract String getDescription();

    public double cost() {
        return 0;
    }
}

decorador

/**
 * 装饰者 摩卡
 */
public class Mocha extends Condiment {
    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription()+" , Mocha";
    }
    public double cost(){
        return 0.20+beverage.cost(); //价格计算从内到外
    }
}
//其他装饰者类似 

lograr starbuzzcoffee

public class StarbuzzCoffee {
    public static void main(String[] args) {
        Beverage beverage=new Espresso();//浓缩咖啡 被装饰对象
        System.out.println(beverage.getDescription()+" "+beverage.cost()); //Espresso--浓缩咖啡 1.99

        //开始装饰
        beverage=new Mocha(beverage);//加上Mocha
        System.out.println(beverage.getDescription()+" "+beverage.cost());//Espresso--浓缩咖啡 , Mocha 2.19

        beverage=new Sony(beverage);
        System.out.println(beverage.getDescription()+" "+beverage.cost());//Espresso--浓缩咖啡 , Mocha , Sony 2.49

        beverage=new Whip(beverage);
        System.out.println(beverage.getDescription()+" "+beverage.cost());//Espresso--浓缩咖啡 , Mocha , Sony , Whip 2.9

        //双倍Mocha
        beverage=new Mocha(beverage);
        System.out.println(beverage.getDescription()+" "+beverage.cost());//Espresso--浓缩咖啡 , Mocha , Sony , Whip , Mocha 3.1
    }
}

Lograr una taza pequeña, taza, taza

public  abstract class CupSize extends Beverage {

    public  abstract String getDescription() ;
    @Override
    public double cost() {
        return 0;
    }
}
public class SmallCup   extends CupSize {
    Beverage beverage;

    @Override
    public String getDescription() {
        return beverage.getDescription()+" , 小杯 多收0.1";
    }

    @Override
    public double cost() {
        return beverage.cost()+0.1;
    }

    public SmallCup(Beverage beverage) {
        this.beverage = beverage;
    }
}

Este ejemplo es equivalente al tamaño de la copa como ingrediente, pero la pregunta es obvia: hay tres clases. Ejemplos del libro se añade al atributo de tamaño en la superclase Bebidas entonces sólo para decorar una clase SizeDe, que determina el tamaño pequeño == | mediados | alto precio a aumentar.

La pregunta anterior restante: cómo delegar? Lo que está encargado?

Entiendo: A medida que el precio de la computación caffee, café en realidad fue comisionado por los ingredientes, el precio del café depende en última instancia del precio de los ingredientes del cálculo. Caffee confiada a la ingredientes caffee añadido (composición) en el ingrediente (es decir decorador) en. Esto resultó en el precio por las capas de invocación de método costo.

Liberadas nueve artículos originales · ganado elogios 4 · Vistas 4247

Supongo que te gusta

Origin blog.csdn.net/qq_42239081/article/details/104869055
Recomendado
Clasificación