原文:http://blog.csdn.net/lmj623565791/article/details/24269409,我没大神那么详细。
鸿洋_大神真是特别有趣的人,不像传说中程序员程序员看起来那么死板,玩传奇的人就是不一样,哈哈
装饰者顾名思义,就是在原来的基础上再套一层。
用传奇举例, 一个红宝石可以加5点攻击力,一个蓝宝石可以加10点攻击,一把狼牙28攻击,可以把两个宝石嵌入到武器槽中。
上代码:
package com.xiaojie.design.decorate;
/**
* 定义一个装备的接口
* @author Administrator
*
*/
public interface IEquip {
/**
* 计算装备的攻击力
*/
int caculateAttrack();
/**
* 装备的描述
*/
String description();
}
package com.xiaojie.design.decorate;
public class ArmEquip implements IEquip{
@Override
public int caculateAttrack() {
return 20;
}
@Override
public String description() {
return "龙牙";
}
}
package com.xiaojie.design.decorate;
public interface IEquipDecorator extends IEquip {
/**
* 基本攻击
*
* @return
*/
int baseAttr();
/**
* 等级
* @return
*/
int grade();
/**
* 设置等级
*/
int setGrade(int grade);
}
package com.xiaojie.design.decorate;
/**
* 红宝石装饰
*
* @author Administrator
*
*/
public class RedGemDecorator implements IEquipDecorator {
public RedGemDecorator(IEquip equip) {
this.equip = equip;
}
/**
* 等级
*/
private int grade = 1;
/**
* 基本属性
*/
private int baseAttr = 5;
/**
* 每个装饰品维护着一个装备
*/
private IEquip equip;
@Override
public int caculateAttrack() {
return getGrade() * baseAttr + equip.caculateAttrack();
}
@Override
public String description() {
return "红宝石: " + equip.description();
}
public int getGrade() {
return grade;
}
public int setGrade(int grade) {
return this.grade = grade;
}
@Override
public int baseAttr() {
return baseAttr;
}
@Override
public int grade() {
return grade;
}
}
package com.xiaojie.design.decorate;
import java.util.Scanner;
public class MainActivity {
public static void main(String[] args) {
IEquipDecorator decorator = new RedGemDecorator(new ArmEquip());
System.out.println(decorator.caculateAttrack());
System.out.println(decorator.description());
// 强化武器
Scanner in = new Scanner(System.in);
System.out.println("强化武器请按1");
int operation = in.nextInt();
if (operation == 1) {
boolean result = IntensifyUtils.EquipDecorator(decorator);
if (result) {
System.out.println(decorator.caculateAttrack());
System.out.println(decorator.description());
} else {
decorator = null;
System.out.println("真倒霉,装逼失败了,装备被销毁了");
}
}
}
}
package com.xiaojie.design.decorate;
import java.util.Random;
public class IntensifyUtils {
/**
* 随便写的
* @param equip
* @return
*/
public static boolean EquipDecorator(IEquipDecorator equip) {
int random = new Random().nextInt(100);
if (random >= 50) {
int grade = equip.grade();
grade++;
equip.setGrade(grade);
return true;
} else {
return false;
}
}
}
其实我这个强化装备我就这么搞搞玩玩,如果真要我写这个强化装备,我也只会写强化宝石,因为一个装备可以嵌入很多宝石。逻辑不对呀,哈哈
用大神的,在家一个蓝宝石,和宝石一样的
IEquip equip = new RedGemDecorator(new RedGemDecorator(
new BlueGemDecorator(new ArmEquip())));
System.out.println(equip.caculateAttrack());
System.out.println(equip.description());