7. Modo de diseño El modo de decorador te lleva de vuelta al mundo legendario.

Hoy continúo el viaje de los patrones de diseño, presentándote el patrón del decorador, las convenciones internacionales, veamos primero la definición.

Modo de decorador: para ampliar la funcionalidad, los decoradores proporcionan una alternativa más flexible que la integración, asignando responsabilidades dinámicamente a los objetos.

Primero, describa brevemente el lugar donde funciona el modo decorador. Cuando diseñamos una clase, necesitamos agregar algunas funciones auxiliares a esta clase y no queremos cambiar el código de esta clase. En este momento, el modo decorador está mostrando su poder. Es la hora. También hay un principio reflejado aquí: la clase debe estar abierta para extensión y cerrada para modificación.

Ahora vayamos al tema. Estaba viendo una película allí hoy, y de repente recordé el viento sangriento en el campo de juego cuando era joven, jaja, introduzcamos el modo decorador con el trasfondo del juego. Los hermanos que hayan jugado el juego deben saber que cada personaje del juego tiene armas, zapatos, muñequeras, anillos y varios rubíes, zafiros, topacios, etc.

Comience con los siguientes requisitos: diseñe el sistema de equipamiento del juego, los requisitos básicos y calcule el poder de ataque y la descripción de cada equipo después de incrustado con varias gemas:

requerimiento específico:

1. Arma (poder de ataque 20), anillo (poder de ataque 5), brazales (poder de ataque 5), zapatos (poder de ataque 5)

2. Zafiro (poder de ataque 5 / pieza), topacio (poder de ataque 10 / pieza), rubí (poder de ataque 15 / pieza)

3. Cada equipo se puede incrustar con 3 piezas a voluntad.

Bien, se introducen los requisitos. Por supuesto, no te quejes de mi diseño. ¿De dónde viene el poder ofensivo de los zapatos Nima? Pueden golpear a la gente en momentos críticos. Comencemos con una idea preliminar. Basándonos en años de experiencia orientada a objetos, podríamos diseñarlo así:
Inserte la descripción de la imagen aquí

Si lo diseñó así, confío en él, solo necesita escribir cientos de categorías y agregar dos gemas al azar. Jaja, ¿ha oído hablar del crecimiento exponencial? Esté preparado para trabajar horas extras.

Tal vez todavía lo diseñe así: escriba una superclase y coloque varias gemas en ella, y luego en el cálculo del poder de ataque, si hay varios tipos de gemas, felicitaciones, la cantidad de código no es muy grande, pero solo agregue un arma , ¿Cuántos IF más tienes que escribir?

Algunos de los posibles diseños descritos anteriormente no son muy buenos, veamos cómo integrar el patrón del decorador:

La primera es la superclase de equipamiento.

package com.zhy.pattern.decorator;
 
/**
 * 装备的接口
 * 
 * @author zhy
 * 
 */
public interface IEquip
{
 
	/**
	 * 计算攻击力
	 * 
	 * @return
	 */
	public int caculateAttack();
 
	/**
	 * 装备的描述
	 * 
	 * @return
	 */
	public String description();
}

Luego están las armas, los anillos, las muñecas, los zapatos

package com.zhy.pattern.decorator;
 
/**
 * 武器
 * 攻击力20
 * @author zhy
 * 
 */
public class ArmEquip implements IEquip
{
 
	@Override
	public int caculateAttack()
	{
		return 20;
	}
 
	@Override
	public String description()
	{
		return "屠龙刀";
	}
 
}
package com.zhy.pattern.decorator;
 
/**
 * 戒指
 * 攻击力 5
 * @author zhy
 *
 */
public class RingEquip implements IEquip
{
 
	@Override
	public int caculateAttack()
	{
		return 5;
	}
 
	@Override
	public String description()
	{
		return "圣战戒指";
	}
 
}
package com.zhy.pattern.decorator;
 
/**
 * 护腕
 * 攻击力 5
 * @author zhy
 *
 */
public class WristEquip implements IEquip
{
 
	@Override
	public int caculateAttack()
	{
		return 5;
	}
 
	@Override
	public String description()
	{
		return "圣战护腕";
	}
 
}
package com.zhy.pattern.decorator;
 
/**
 * 鞋子
 * 攻击力 5
 * @author zhy
 * 
 */
public class ShoeEquip implements IEquip
{
 
	@Override
	public int caculateAttack()
	{
		return 5;
	}
 
	@Override
	public String description()
	{
		return "圣战靴子";
	}
 
}

A continuación, por supuesto, decoraciones, gemas, primera superclase.

package com.zhy.pattern.decorator;
 
/**
 * 装饰品的接口
 * @author zhy
 *
 */
public interface IEquipDecorator extends IEquip
{
	
}

Zafiro, topacio, rubí hacia abajo

package com.zhy.pattern.decorator;
 
/**
 * 蓝宝石装饰品
 * 每颗攻击力+5
 * @author zhy
 * 
 */
public class BlueGemDecorator implements IEquipDecorator
{
	/**
	 * 每个装饰品维护一个装备
	 */
	private IEquip equip;
 
	public BlueGemDecorator(IEquip equip)
	{
		this.equip = equip;
	}
 
	@Override
	public int caculateAttack()
	{
		return 5 + equip.caculateAttack();
	}
 
	@Override
	public String description()
	{
		return equip.description() + "+ 蓝宝石";
	}
 
}
package com.zhy.pattern.decorator;
 
/**
 * 黄宝石装饰品
 * 每颗攻击力+10
 * @author zhy
 * 
 */
public class YellowGemDecorator implements IEquipDecorator
{
	/**
	 * 每个装饰品维护一个装备
	 */
	private IEquip equip;
 
	public YellowGemDecorator(IEquip equip)
	{
		this.equip = equip;
	}
 
	@Override
	public int caculateAttack()
	{
		return 10 + equip.caculateAttack();
	}
 
	@Override
	public String description()
	{
		return equip.description() + "+ 黄宝石";
	}
 
}
package com.zhy.pattern.decorator;
 
/**
 * 红宝石装饰品 每颗攻击力+15
 * 
 * @author zhy
 * 
 */
public class RedGemDecorator implements IEquipDecorator
{
	/**
	 * 每个装饰品维护一个装备
	 */
	private IEquip equip;
 
	public RedGemDecorator(IEquip equip)
	{
		this.equip = equip;
	}
 
	@Override
	public int caculateAttack()
	{
		return 15 + equip.caculateAttack();
	}
 
	@Override
	public String description()
	{
		return equip.description() + "+ 红宝石";
	}
 
}

Bueno, ese es el final, hemos implementado las funciones requeridas, es claro y simple para cada clase, veamos la prueba a continuación:

package com.zhy.pattern.decorator;
 
public class Test
{
	public static void main(String[] args)
	{
		// 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
		System.out.println(" 一个镶嵌2颗红宝石,1颗蓝宝石的靴子");
		IEquip equip = new RedGemDecorator(new RedGemDecorator(new BlueGemDecorator(new ShoeEquip())));
		System.out.println("攻击力  : " + equip.caculateAttack());
		System.out.println("描述 :" + equip.description());
		System.out.println("-------");
		// 一个镶嵌1颗红宝石,1颗蓝宝石的武器
		System.out.println(" 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器");
		equip = new RedGemDecorator(new BlueGemDecorator(new YellowGemDecorator(new ArmEquip())));
		System.out.println("攻击力  : " + equip.caculateAttack());
		System.out.println("描述 :" + equip.description());
		System.out.println("-------");
	}
}

Salida:

 一个镶嵌2颗红宝石,1颗蓝宝石的靴子
攻击力  : 40
描述 :圣战靴子+ 蓝宝石+ 红宝石+ 红宝石

 一个镶嵌1颗红宝石,1颗蓝宝石,1颗黄宝石的武器
攻击力  : 50
描述 :屠龙刀+ 黄宝石+ 蓝宝石+ 红宝石

Nos guste o no, si necesita más equipo o gemas, podemos agregarlo a voluntad y luego salir del trabajo felizmente.

Bueno, felicidades, has aprendido otro patrón de diseño, el patrón de decorador.

Ahora entiendo la definición basada en el ejemplo, así que no necesito decir más.

También hay un patrón de decorador en la API de Java. Si es nuevo en Java, debe recordar las distintas secuencias en Java. Es doloroso, pero cuando sabe

Tu diseño se sentirá más claro después.

Inserte la descripción de la imagen aquí

Piense en InputStream como nuestro IEquip y FilterInputStream como nuestro IEquipDecorator, ¿es casi lo mismo que nuestro diseño?

Supongo que te gusta

Origin blog.csdn.net/GTC_GZ/article/details/108745449
Recomendado
Clasificación