java设计模式进阶_property

这里写图片描述

//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : Prototype.java
//  @ Date : 2016/9/1
//  @ Author : 
//
//




public interface Prototype {
    public Integer get(Stats stats);
    public boolean has(Stats stats);
    public void set(Stats stats, Integer val);
    public void remove(Stats stats);
}

import java.util.HashMap;
import java.util.Map;


//
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Untitled
//  @ File Name : Character.java
//  @ Date : 2016/9/1
//  @ Author : 
//
//




public class Character implements Prototype {

    public enum Type{
        WARRIOR,
        MAGE,
        ROGUE
    }
    private final Prototype prototype;
    private Map<Stats,Integer> properties = new HashMap<>();
    private String name;
    private Type type;

    public Character() {
        this.prototype = new Prototype() { // Null-value object
            @Override
            public Integer get(Stats stat) {
                return null;
            }
            @Override
            public boolean has(Stats stat) {
                return false;
            }
            @Override
            public void set(Stats stat, Integer val) {
            }
            @Override
            public void remove(Stats stat) {
            }}
        ;
    }

    public Character(Type type, Prototype prototype) {
        this.type = type;
        this.prototype = prototype;
    }

    public Character(String name, Character prototype) {
        this.name = name;
        this.type = prototype.type;
        this.prototype = prototype;
    }

    public String name() {
        return name;
    }

    public Type type() {
        return type;
    }

    public Integer get(Stats stat) {
        boolean containsValue = properties.containsKey(stat);
        if (containsValue) {
            return properties.get(stat);
        } else {
            return prototype.get(stat);
        }
    }

    public boolean has(Stats stats) {
        return get(stats) != null;
    }

    public void set(Stats stat, Integer val) {
        properties.put(stat, val);
    }

    public void remove(Stats stats){
        properties.put(stats, null);
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        if (name != null) {
            builder
                .append("Player: ")
                .append(name)
                .append("\n");
        }

        if (type != null) {
            builder
                .append("Character type: ")
                .append(type.name())
                .append("\n");
        }

        builder.append("Stats:\n");
        for (Stats stat : Stats.values()) {
            Integer value = this.get(stat);
            if (value == null) {
                continue;
            }
            builder
                .append(" - ")
                .append(stat.name())
                .append(":")
                .append(value)
                .append("\n");
        }
        return builder.toString();
    }

}


public enum Stats {
    AGILITY, STRENGTH, ATTACK_POWER, ARMOR, INTELLECT, SPIRIT, ENERGY, RAGE
}


import com.think.in.java.design.pattern.lesson31.Character.Type;


public class App {
    public static void main(String[] args) {
        /* set up */
        Prototype charProto = new Character();
        charProto.set(Stats.STRENGTH, 10);
        charProto.set(Stats.AGILITY, 10);
        charProto.set(Stats.ARMOR, 10);
        charProto.set(Stats.ATTACK_POWER, 10);

        Character mageProto = new Character(Type.MAGE, charProto);
        mageProto.set(Stats.INTELLECT, 15);
        mageProto.set(Stats.SPIRIT, 10);

        Character warProto = new Character(Type.WARRIOR, charProto);
        warProto.set(Stats.RAGE, 15);
        warProto.set(Stats.ARMOR, 15); // boost default armor for warrior

        Character rogueProto = new Character(Type.ROGUE, charProto);
        rogueProto.set(Stats.ENERGY, 15);
        rogueProto.set(Stats.AGILITY, 15); // boost default agility for rogue

        /* usage */
        Character mag = new Character("Player_1", mageProto);
        mag.set(Stats.ARMOR, 8);
        System.out.println(mag);

        Character warrior = new Character("Player_2", warProto);
        System.out.println(warrior);

        Character rogue = new Character("Player_3", rogueProto);
        System.out.println(rogue);

        Character rogueDouble = new Character("Player_4", rogue);
        rogueDouble.set(Stats.ATTACK_POWER, 12);
        System.out.println(rogueDouble);
    }
}

/*
Player: Player_1
Character type: MAGE
Stats:
 - AGILITY:10
 - STRENGTH:10
 - ATTACK_POWER:10
 - ARMOR:8
 - INTELLECT:15
 - SPIRIT:10

Player: Player_2
Character type: WARRIOR
Stats:
 - AGILITY:10
 - STRENGTH:10
 - ATTACK_POWER:10
 - ARMOR:15
 - RAGE:15

Player: Player_3
Character type: ROGUE
Stats:
 - AGILITY:15
 - STRENGTH:10
 - ATTACK_POWER:10
 - ARMOR:10
 - ENERGY:15

Player: Player_4
Character type: ROGUE
Stats:
 - AGILITY:15
 - STRENGTH:10
 - ATTACK_POWER:12
 - ARMOR:10
 - ENERGY:15*/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值