El patrón decorador del modelo de diseño (incluido un ejemplo completo de UML)

Patrón decorador para modelos de diseño.

1. Modo decorador

1.1 Definición y características

  Definición del modo Decorador (Decorador): se refiere al modo de agregar dinámicamente algunas responsabilidades (es decir, agregar funciones adicionales) al objeto sin cambiar la estructura del objeto existente. Pertenece al modo de estructura del objeto. (Un poco como la función del modo proxy. El objeto proxy proporciona el mismo método que el objeto real y puede extender la función del objeto real
  ) . Las principales ventajas del modo decorador son:

  • Es más flexible usar el modo de decoración para extender la función del objeto que adoptar el método de herencia.
  • Es posible diseñar múltiples clases de decoración específicas diferentes y crear una combinación de múltiples comportamientos diferentes.

  La principal desventaja es que el modo de decoración agrega muchas subcategorías, si se usa en exceso hará que el programa sea muy complicado.

  La diferencia entre el modo decorador y el modo puente: el
  enfoque del modo puente es la combinación de varias dimensiones a través de la relación de combinación, y el enfoque del modo decorador es agregar dinámicamente algunas responsabilidades al objeto sin cambiar la estructura del objeto existente. .

1.2 Estructura del modelo.

El modo de decoración incluye principalmente los siguientes personajes.

  1. Función de componente abstracto (Componente): defina una interfaz abstracta para estandarizar los objetos que están listos para recibir responsabilidades adicionales.
  2. Rol Componente concreto (Componente concreto): para lograr un componente abstracto, agregue algunas responsabilidades al decorar el rol.
  3. Rol de decoración abstracta (Decorador): para lograr componentes abstractos, y contiene instancias de componentes específicos, puede extender las funciones de componentes específicos a través de sus subclases.
  4. Rol de decorador de hormigón: implementa métodos relacionados de decoración abstracta y agrega responsabilidades adicionales a los objetos componentes de hormigón.

1.3 Origen del problema

  En la vida real, a menudo es necesario agregar nuevas funciones o embellecer la apariencia de productos existentes, como la decoración de la casa, fotos y marcos de fotos. En el proceso de desarrollo de software, a veces quiero usar algunos componentes existentes. Estos componentes pueden completar algunas funciones básicas. Pero sin cambiar su estructura, puede expandir dinámicamente sus funciones. Si se adopta la herencia, a medida que aumenta la función de extensión, hará que la subclase se expanda.

1.4 Soluciones

  Si el método de herencia se usa para implementar la función de extensión del objeto de clase, la subclase se expandirá mucho, por lo que combinamos la clase de objeto original en la clase de extensión (clase de decoración), de modo que cuando se van a extender nuevas funciones, simplemente coloque la clase de extensión anterior en La nueva clase de extensión puede superponer nuevas funciones sin cambiar la estructura del objeto original.

1.5 tipos de UML

Inserte la descripción de la imagen aquí

1.6 Solución

/**
 * @author 26530
 * 奶茶
 */
public interface  MilkTea 
{
	     String getMilkName();     
	     float getPrice();
}
/**
 * @author 26530
 * 珍珠奶茶
 */
public class PearlMilkTea implements MilkTea{

	@Override
	public String getMilkName() 
	{
		return "珍珠奶茶";
	}

	@Override
	public float getPrice() 
	{
		return 10;
	}

}
/**
 * @author 26530
 * 巧克力奶茶
 */
public class ChocolateMilkTea implements MilkTea{

	@Override
	public String getMilkName() 
	{
		return "巧克力奶茶";
	}

	@Override
	public float getPrice() 
	{
		return 11;
	}



}
/**
 * @author 26530
 * 烧仙草
 */
public class HerbalJellyMilkTea implements MilkTea{

	@Override
	public String getMilkName() {
		// TODO Auto-generated method stub
		return "烧仙草";
	}

	@Override
	public float getPrice() {
		// TODO Auto-generated method stub
		return 15;
	}

}

/**
 * @author 26530
 * 口味
 */
public abstract class AddTasteMilkTea implements  MilkTea
{
	abstract String getState();
	MilkTea milkTea;

	public MilkTea getMilkTea() 
	{
		return milkTea;
	}

	public void setMilkTea(MilkTea milkTea) 
	{
		this.milkTea = milkTea;
	}

	public String getMilkName() 
	{
		// TODO Auto-generated method stub
		return this.milkTea.getMilkName();
	}

	public float getPrice() 
	{
		// TODO Auto-generated method stub
		return this.milkTea.getPrice();
	}
}

/**
 * @author 26530
 * 少冰
 */
public class AddHalfIceMilkTea  extends AddTasteMilkTea{

	@Override
	public String getState()
	{
		return "少冰";
	}
	
	@Override
	public String getMilkName() 
	{
		return super.getMilkName() + getState();
	}
	@Override
	public float getPrice() 
	{
		return super.getPrice();
	}
	
	public AddHalfIceMilkTea(MilkTea milkTea) {
		super.milkTea = milkTea;
	}

}
/**
 * @author 26530
 *  去冰
 */
public class AddNoIceMilkTea  extends AddTasteMilkTea{

	@Override
	public String getState() 
	{
		return "去冰";
	}
	
	public String getMilkName() 
	{
		return super.getMilkName() + getState();
	}
	
	public float getPrice() 
	{
		return super.getPrice();
	}
	
	public AddNoIceMilkTea(MilkTea milkTea) {
		super.milkTea = milkTea;
	}

}
/**
 * @author 26530
 * 全糖
 */
public class AddNormalSugerMilkTea extends AddTasteMilkTea{

	@Override
	public String getState() {
		// TODO Auto-generated method stub
		return "全糖";
	}
	
	public String getMilkName() 
	{
		return super.getMilkName() + getState();
	}
	
	public float getPrice() 
	{
		return super.getPrice();
	}
	
	public AddNormalSugerMilkTea(MilkTea milkTea) {
		super.milkTea = milkTea;
	}

}

/**
 * @author 26530
 * 无糖
 */
public class AddSugarFreeMilkTea extends AddTasteMilkTea      {

	@Override
	public String getState() {
		// TODO Auto-generated method stub
		return "无糖";
	}
	public String getMilkName() 
	{
		return super.getMilkName() + getState();
	}
	
	public float getPrice() 
	{
		return super.getPrice();
	}
	public AddSugarFreeMilkTea(MilkTea milkTea) 
	{
		super.milkTea = milkTea;
	}
	
	

}
/**
 * @author 26530
 * 选择大杯,中杯,小杯
 */
public abstract class ChooseCapacityMilkTea implements MilkTea
{
	abstract String getSize();
	MilkTea milkTea;
	public MilkTea getMilkTea() {
		return milkTea;
	}
	public void setMilkTea(MilkTea milkTea) {
		this.milkTea = milkTea;
	}
	public  String getMilkName()
	{
		return this.milkTea.getMilkName();
	}
	
	public  float  getPrice()
	{
		return this.milkTea.getPrice();
	}
	  
	
}

/**
 * @author 26530
 * 大杯
 */
public class LargeMilkTea extends ChooseCapacityMilkTea{

	@Override
	public String getSize() 
	{
		return "大杯";
	}
	
	public String getMilkName() 
	{
		return  getSize() + super.getMilkName() ;
	}
	
	public float getPrice() 
	{
		return super.getPrice() + 5;
	}
	
	public LargeMilkTea(MilkTea milkTea) {
		super.milkTea = milkTea;
	}

}
/**
 * @author 26530
 * 中杯
 */
public class MediumMilkTea extends ChooseCapacityMilkTea{

	@Override
	public String getSize() 
	{
		return "中杯";
	}
	
	public String getMilkName() 
	{
		return  getSize() + super.getMilkName() ;
	}
	
	public float getPrice() 
	{
		return super.getPrice() + 3;
	}

	public MediumMilkTea(MilkTea milkTea) {
		super.milkTea = milkTea;
	}
	
	

}
/**
 * @author 26530
 * 小杯
 */
public class SmallMilkTea extends ChooseCapacityMilkTea{

	@Override
	public String getSize() 
	{
		return "小杯";
	}
	
	public String getMilkName() 
	{
		return  getSize() + super.getMilkName() ;
	}
	
	public float getPrice() 
	{
		return super.getPrice() ;
	}

	public SmallMilkTea(MilkTea milkTea) 
	{
	     super.milkTea = milkTea;
	}

	
	
	
   
}
public class Test 
{
    public static void main(String[] args) 
    {
    	PearlMilkTea pearlMilkTea = new PearlMilkTea();
    	System.out.println(pearlMilkTea.getMilkName());
    	System.out.println(pearlMilkTea.getPrice());
    	LargeMilkTea capacity  = new LargeMilkTea(pearlMilkTea);
    	AddSugarFreeMilkTea addSugarFreeMilkTea = new AddSugarFreeMilkTea(capacity);
    	System.out.println(addSugarFreeMilkTea.getMilkName());
    	System.out.println(addSugarFreeMilkTea.getPrice());
    	/*
	    	           珍珠奶茶
				10.0
				大杯珍珠奶茶无糖
				15.0
    	 */
    	
    	
	}
}
56 artículos originales publicados · Me gusta1 · Visitas1168

Supongo que te gusta

Origin blog.csdn.net/atu1111/article/details/105474655
Recomendado
Clasificación