设计融合_ c#

单例模式

using System;
namespace DesignIntegration{
    public class TimeManager{
        private static TimeManager _instance;
        private static readonly Object locker = new Object();
        private TimeManager() { }
        public static TimeManager Instance{
            get{
                //当地一个线程运行到这里时
                //此时会对locker对象“枷锁”,
                //当第二个线程运行该方法时,首先检测到locker对象为“加锁”状态,
                //该线程就会挂起等待第一个线程解锁
                if (_instance == null){
                    lock (locker){
                        if (locker == null)
                            _instance = new TimeManager();
                    }
                }
                return _instance;
            }
        }
        public void Greet() {
            DateTime dateTime = DateTime.Now;
            Console.WriteLine($"我是地球Online的时间管理者,现在时间是{dateTime}");
        }
    }
}

using System;
namespace DesignIntegration{
    //工厂模式
    public abstract class IItem{
        //武器名称
        protected string Name { get; set; }
        //道具编号
        protected int ID { get; set; }
        //道具描述
        protected string Description { get; set; }
        //虚方法 子类可以按照需要决定是否重写
        public virtual void Use() {
            Console.WriteLine("使用道具的方法");
        }
        public IItem(string name, int iD, string description){
            Name = name;
            ID = iD;
            Description = description;
        }
    }
}

namespace DesignIntegration{
    public abstract class IItemIWeapon : IItem{
        //攻击力
        protected float AttackValue { 
            get; 
        }
        protected IItemIWeapon(string name, int iD, string description,
            float attackValue) : base(name, iD, description){
            AttackValue = attackValue;
        }
        //抽象攻击方法
        public abstract void Attack();
    }
}

using System;
namespace DesignIntegration{
    public class IWeaponSword : IItemIWeapon{
        public IWeaponSword(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        //装备武器
        public override void Use(){
            Console.WriteLine($",双手紧握");
        }
        public override void Attack() {
            Console.WriteLine($"{Name}发动攻击");
            //可以嵌入桥接模式
        }
    }
}

namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        //角色名字
        public string Name { get; set; }
        //角色ID
        public int ID { get; }
    }
}


修改抽象武器基类攻击方法

namespace DesignIntegration{
    public abstract class IItemIWeapon : IItem{
        //攻击力
        protected float AttackValue { 
            get; 
        }
        protected IItemIWeapon(string name, int iD, string description,
            float attackValue) : base(name, iD, description){
            AttackValue = attackValue;
        }
        //抽象攻击方法 - 单体攻击
        public abstract void Attack(IPlayer player);
    }
}

namespace DesignIntegration{
    public abstract class IAction{
        public string Name { get; }
        //播放动作
        public abstract void Behaviour();
        public IAction(string name){
            Name = name;
        }
    }
}

武器桥接动作

namespace DesignIntegration{
    public abstract class IItemIWeapon : IItem{
        //攻击力
        protected float AttackValue { get; }
        //动作
        protected IAction _action = null;
        //设置武器动作
        public void SetWeaponAction(IAction action) {
            _action = action;
        }
        protected IItemIWeapon(string name, int iD, string description,
            float attackValue) : base(name, iD, description){
            AttackValue = attackValue;
        }
        //抽象攻击方法 - 单体攻击
        public abstract void Attack(IPlayer player);
    }
}

namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        //角色名字
        public string Name { get; set; }
        //角色ID
        public int ID { get; }
        public IRole(string name,int id) {
            Name = name;
            ID = id;
        }
    }
}

namespace DesignIntegration{
    public class RoleMonster : IRole{
        public RoleMonster(string name, int id) : base(name, id){
        }
    }
}
更新Program类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignIntegration{
    public class Program{
        public static void Main(string[] args){
            //TimeManager.Instance.Greet();
            IRole monster = new RoleMonster("Bug兽",20001);
            IItem sword = new IWeaponSword("火焰圣剑", 5001, "中级武器", 15f);
            ((IItemIWeapon)sword).Attack(monster);
        }
    }
}

using System;
namespace DesignIntegration{
    public class ActionSweepHorizontally : IAction{
        public ActionSweepHorizontally(string name) : base(name){
        }
        public override void Behaviour(){
            Console.WriteLine("从左至右横扫");
        }
    }
}
修改武器子剑类

using System;
namespace DesignIntegration{
    public class IWeaponSword : IItemIWeapon{
        public IWeaponSword(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        //装备武器
        public override void Use(){
            Console.WriteLine($"双手紧握");
        }
        public override void Attack(IRole role) {
            if (_action == null)
                Console.WriteLine($"{Name}发动攻击");
            else {
                //播放动作动画
                _action.Behaviour();
                Console.WriteLine($"{Name}发动攻击");
            }
            //受攻击方减血
        }
    }
}

运行

新增动作

using System;
namespace DesignIntegration{
    public class ActionRaise : IAction{
        public ActionRaise(string name) : base(name){
        }
        public override void Behaviour(){
            //新增动作动画
            Console.WriteLine("举过头顶 往下劈砍");
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignIntegration{
    public class Program{
        public static void Main(string[] args){
            //TimeManager.Instance.Greet();
            IRole monster = new RoleMonster("Bug兽",20001);
            IItem sword = new IWeaponSword("火焰圣剑", 5001, "中级武器", 15f);
            //((IItemIWeapon)sword).SetWeaponAction(new ActionSweepHorizontally("横扫千钧"));
            //切换新动作
            ((IItemIWeapon)sword).SetWeaponAction(new ActionRaise("下劈"));
            ((IItemIWeapon)sword).Attack(monster);
        }
    }
}
修改抽象角色基类

namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        //角色名字
        public string Name { get; set; }
        //角色ID
        public int ID { get; }
        //最大血量
        protected float MaxHp { get; set; }
        //当前血量
        protected float CurrentHp { get; set; }
        public IRole(string name,int id,float maxHp) {
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
        }
    }
}
修改角色子类

namespace DesignIntegration{
    public class RoleMonster : IRole{
        public RoleMonster(string name, int id, float maxHp) : base(name, id, maxHp){
        }
    }
}
修改Program类

修改角色基类代码

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        //角色名字
        public string Name { get; set; }
        //角色ID
        public int ID { get; }
        //最大血量
        protected float MaxHp { get; set; }
        //当前血量
        protected float CurrentHp { get; set; }
        public IRole(string name,int id,float maxHp) {
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
        }
        //伤害
        public void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
    }
}

using System;
namespace DesignIntegration{
    public class IWeaponSword : IItemIWeapon{
        public IWeaponSword(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        //装备武器
        public override void Use(){
            Console.WriteLine($"双手紧握");
        }
        public override void Attack(IRole role) {
            if (_action == null)
                Console.WriteLine($"{Name}发动攻击");
            else {
                //播放动作动画
                _action.Behaviour();
                Console.WriteLine($"{Name}发动攻击");
            }
            //受攻击方减血
            role.TakeDamage(AttackValue);
        }
    }
}
运行实现掉血

接下来设置玩家控制武器打怪物后使怪物掉血

namespace DesignIntegration{
    public class RolePlayer : IRole{
        public RolePlayer(string name, int id, float maxHp) : base(name, id, maxHp){
        }
    }
}

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        public string Name { get; set; }//角色名字
        public int ID { get; }//角色ID
        protected float MaxHp { get; set; }//最大血量
        protected float CurrentHp { get; set; }//当前血量
        protected float HitValue { get; set; }//无武器攻击值
        protected IItem _item = null;//道具
        protected IAction _action = null;//动作
        public IRole(string name,int id,float maxHp) {
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
        }
        //伤害
        public void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
    }
}

修改角色子类

namespace DesignIntegration{
    public class RolePlayer : IRole{
        public RolePlayer(string name, int id, float maxHp,
            float hitValue) : base(name, id, maxHp, hitValue){
        }
    }
}

namespace DesignIntegration{
    public class RoleMonster : IRole{
        public RoleMonster(string name, int id, float maxHp,
            float hitValue) : base(name, id, maxHp, hitValue){
        }
    }
}
修改Program类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignIntegration{
    public class Program{
        public static void Main(string[] args){
            //TimeManager.Instance.Greet();
            IRole monster = new RoleMonster("Bug兽",20001,60f,20f);
            IItem sword = new IWeaponSword("火焰圣剑", 50001, "中级武器", 15f);
            //((IItemIWeapon)sword).SetWeaponAction(new ActionSweepHorizontally("横扫千钧"));
            //切换新动作
            ((IItemIWeapon)sword).SetWeaponAction(new ActionRaise("下劈"));
            ((IItemIWeapon)sword).Attack(monster);
        }
    }
}

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        public string Name { get; set; }//角色名字
        public int ID { get; }//角色ID
        protected float MaxHp { get; set; }//最大血量
        protected float CurrentHp { get; set; }//当前血量
        protected float HitValue { get; set; }//无武器攻击值
        protected IItem _item = null;//道具
        protected IAction _action = null;//动作
        public IRole(string name,int id, float maxHp, float hitValue){
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
            HitValue = hitValue;
        }
        //伤害
        public void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
        //使用道具
        public virtual void UseItem(IItem item) {
            _item = item;
            Console.WriteLine($"{Name}使用了{_item.Name}");
        }
    }
}

using System;
namespace DesignIntegration{
    public class RolePlayer : IRole{
        public RolePlayer(string name, int id, float maxHp,
            float hitValue) : base(name, id, maxHp, hitValue){
        }
        public override void UseItem(IItem item){
            _item = item;
            Console.WriteLine($"{Name}从背包中拿出{_item.Name}");
            _item.Use();
        }
    }
}

接下来设定道具的使用动作

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        public string Name { get; set; }//角色名字
        public int ID { get; }//角色ID
        protected float MaxHp { get; set; }//最大血量
        protected float CurrentHp { get; set; }//当前血量
        protected float HitValue { get; set; }//无武器攻击值
        protected IItem _item = null;//道具
        protected IAction _action = null;//动作
        public IRole(string name,int id, float maxHp, float hitValue){
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
            HitValue = hitValue;
        }
        //伤害
        public void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
        //使用道具
        public virtual void UseItem(IItem item) {
            _item = item;
            Console.WriteLine($"{Name}使用了{_item.Name}");
            //如果是非武器类道具 则_item使用后设为空
            if(!(_item is IItemIWeapon))
                _item = null;
        }
        //攻击方法
        public virtual void Attack(IRole role) {
            //有武器
            if (_item != null && _item is IItemIWeapon){
                Console.WriteLine($"{Name}使用{_item.Name}发起攻击");
                ((IItemIWeapon)_item).Attack(role);
            }
            else {
                Console.WriteLine($"空手发起攻击");
                role.TakeDamage(HitValue);
            }
        }
        //使用道具的使用动作
        public virtual void SetUseItemAction(IAction action) {
            _action = action;
            //如果_item属于武器 则设置动作
            if(_item is IItemIWeapon)
                ((IItemIWeapon)_item).SetWeaponAction(action);
        }
    }
}

增加动作

目前玩家可以打怪物 但怪物不可以打玩家

现在做怪物攻击玩家,首先在角色子类怪物类进行重写

using System;
namespace DesignIntegration{
    public class RoleMonster : IRole{
        public RoleMonster(string name, int id, float maxHp,
            float hitValue) : base(name, id, maxHp, hitValue){
        }

        public override void Attack(IRole role){
            //有武器
            if (_item != null && _item is IItemIWeapon)
                ((IItemIWeapon)_item).Attack(role);
            else {
                Console.WriteLine($"{Name}用嘴咬向{role.Name}");
                role.TakeDamage(HitValue);
            }
        }
    }
}

运行即实现桥接模式
接下来显示玩家的状态信息

添加抽象药水基类

namespace DesignIntegration{
    //抽象药水基类
    public abstract class IItemIPotion : IItem{
        protected IItemIPotion(string name, int iD,
            string description) : base(name, iD, description){
        }
    }
}

namespace DesignIntegration{
    //生命值药水
    public class IPotionRed : IItemIPotion{
        public IPotionRed(string name, int iD, 
            string description) : base(name, iD, description){
        }
    }
}

using System;
namespace DesignIntegration{
    //工厂模式
    public abstract class IItem{
        public string Name { get; set; }//武器名称
        protected int ID { get; set; }//道具编号
        protected string Description { get; set; }//道具描述
        protected IRole Role { get; set; } //角色
        //虚方法 子类可以按照需要决定是否重写
        public virtual void Use() {
            Console.WriteLine("使用道具的方法");
        }
        public IItem(string name, int iD, string description){
            Name = name;
            ID = iD;
            Description = description;
        }
    }
}

修改角色子类

using System;
namespace DesignIntegration{
    public class RolePlayer : IRole{
        public RolePlayer(string name, int id, float maxHp,
            float hitValue) : base(name, id, maxHp, hitValue){
        }
        public override void UseItem(IItem item){
            _item = item;
            //将角色传给道具
            _item.Role = this;
            Console.Write($"{Name}从背包中拿出{_item.Name}");
            _item.Use();
        }
    }
}

using System;
namespace DesignIntegration{
    //生命值药水
    public class IPotionRed : IItemIPotion{
        public IPotionRed(string name, int iD, 
            string description) : base(name, iD, description){
        }
        public override void Use(){
            if (Role != null) {
                Console.WriteLine($"{Role.Name}仰头喝下{Name}");
                //加血
            }
        }
    }
}

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        public string Name { get; set; }//角色名字
        public int ID { get; }//角色ID
        protected float MaxHp { get; set; }//最大血量
        protected float CurrentHp { get; set; }//当前血量
        protected float HitValue { get; set; }//无武器攻击值
        protected IItem _item = null;//道具
        protected IAction _action = null;//动作
        public IRole(string name,int id, float maxHp, float hitValue){
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
            HitValue = hitValue;
        }
        //伤害
        public virtual void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
        //加血
        public virtual void AddHp(float hp) {
            CurrentHp += hp;
            if(CurrentHp > MaxHp)
                CurrentHp = MaxHp;
        }
        //使用道具
        public virtual void UseItem(IItem item) {
            _item = item;
            Console.WriteLine($"{Name}使用了{_item.Name}");
            //如果是非武器类道具 则_item使用后设为空
            if(!(_item is IItemIWeapon))
                _item = null;
        }
        //攻击方法
        public virtual void Attack(IRole role) {
            //有武器
            if (_item != null && _item is IItemIWeapon){
                Console.WriteLine($"{Name}使用{_item.Name}发起攻击");
                ((IItemIWeapon)_item).Attack(role);
            }
            else {
                Console.WriteLine($"空手发起攻击");
                role.TakeDamage(HitValue);
            }
        }
        //使用道具的使用动作
        public virtual void SetUseItemAction(IAction action) {
            _action = action;
            //如果_item属于武器 则设置动作
            if(_item is IItemIWeapon)
                ((IItemIWeapon)_item).SetWeaponAction(action);
        }
    }
}

namespace DesignIntegration{
    //抽象药水基类
    public abstract class IItemIPotion : IItem{
        //附带效果值
        protected float _addValue;
        protected IItemIPotion(string name, int iD,string description,
            float addValue) : base(name, iD, description){
            _addValue = addValue;
        }
    }
}

using System;
namespace DesignIntegration{
    //生命值药水
    public class IPotionRed : IItemIPotion{
        public IPotionRed(string name, int iD, string description,
            float addValue) : base(name, iD, description, addValue){
        }
        public override void Use(){
            if (Role != null) {
                Console.WriteLine($"{Role.Name}仰头喝下{Name}");
                //加血
                Role.AddHp(_addValue);
            }
        }
    }
}

using System;
namespace DesignIntegration{
    //抽象角色基类
    public abstract class IRole{
        public string Name { get; set; }//角色名字
        public int ID { get; }//角色ID
        protected float MaxHp { get; set; }//最大血量
        protected float CurrentHp { get; set; }//当前血量
        protected float HitValue { get; set; }//无武器攻击值
        protected IItem _item = null;//道具
        protected IAction _action = null;//动作
        public IRole(string name,int id, float maxHp, float hitValue){
            Name = name;
            ID = id;
            MaxHp = maxHp;
            CurrentHp = maxHp;
            HitValue = hitValue;
        }
        //伤害
        public virtual void TakeDamage(float damage) {
            if (damage < CurrentHp){
                CurrentHp -= damage;
                Console.WriteLine($"{Name}掉了{damage}滴血");
            }
            else {
                CurrentHp = 0;
                Console.WriteLine($"{Name}已经死亡");
            }
        }
        //加血
        public virtual void AddHp(float hp) {
            CurrentHp += hp;
            if(CurrentHp > MaxHp)
                CurrentHp = MaxHp;
            //拓展 计算增加了多少血 差值{hp}有bug
            Console.WriteLine($"{Name}当前生命值增加{hp}");
        }
        //使用道具
        public virtual void UseItem(IItem item) {
            _item = item;
            Console.WriteLine($"{Name}使用了{_item.Name}");
            //如果是非武器类道具 则_item使用后设为空
            if(!(_item is IItemIWeapon))
                _item = null;
        }
        //攻击方法
        public virtual void Attack(IRole role) {
            //有武器
            if (_item != null && _item is IItemIWeapon){
                Console.WriteLine($"{Name}使用{_item.Name}发起攻击");
                ((IItemIWeapon)_item).Attack(role);
            }
            else {
                Console.WriteLine($"空手发起攻击");
                role.TakeDamage(HitValue);
            }
        }
        //使用道具的使用动作
        public virtual void SetUseItemAction(IAction action) {
            _action = action;
            //如果_item属于武器 则设置动作
            if(_item is IItemIWeapon)
                ((IItemIWeapon)_item).SetWeaponAction(action);
        }
    }
}

接下来我们再创建一把武器弓

using System;
using System.Collections.Generic;
using System.Linq;
namespace DesignIntegration{
    public class IWeaponBow : IItemIWeapon{
        public IWeaponBow(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        //装备武器
        public override void Use(){
            Console.WriteLine($"拉弓");
        }
        public override void Attack(IRole role){
            if (_action == null)
                Console.WriteLine($"{Name}发动攻击");
            else{
                //播放动作动画
                _action.Behaviour();
                Console.WriteLine($"弯弓搭箭 群体攻击");
            }
            //受攻击方减血
            role.TakeDamage(AttackValue);
        }
    }
}
【||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||工厂模式||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||】

using System;
namespace DesignIntegration{
    //简单道具工厂
    public class ItemSimpleFactory{
        public static IItem CreateItem(string itemType, int id, 
            string name, string description, float attackValue) {
            IItem item = null;
            switch (itemType) {
                case "Sword":
                    item = new IWeaponSword(name,id,description,attackValue);
                    break;
                case "Bow":
                    item = new IWeaponBow(name,id,description,attackValue);
                    break;
                case "PotionRed":
                    item = new IPotionRed(name, id, description, attackValue);
                    break;
                default:
                    throw new ArgumentException("未知物品类型");
            }
            return item;
        }
    }
}
【||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||建造者模式||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||】

namespace DesignIntegration{
    //抽象武器基类
    public abstract class IItemIWeapon : IItem{
        protected float AttackValue { set; get; }//攻击力
        protected IAction _action = null;//动作
        protected float Durability { set; get; } = 10f;//耐久度
        //设置武器动作
        public void SetWeaponAction(IAction action) {
            _action = action;
        }
        protected IItemIWeapon(string name, int iD, string description,
            float attackValue) : base(name, iD, description){
            AttackValue = attackValue;
        }
        //抽象攻击方法 - 单体攻击
        public abstract void Attack(IRole role);
    }
}

namespace DesignIntegration{
    //抽象道具建造者
    public abstract class IItemBuilder{
        //设置待加工道具
        public abstract void SetBaseItem(IItem item);
        //添加特殊材料改进物品
        public virtual void AddMaterial(string material) { }
        //提升锋利度
        public virtual void ImproveSharpness() { }
        //加固物品的结构 增加耐久度
        public virtual void ReinforceStructure() { }
        //镶嵌宝石 提供特殊属性加成
        public virtual void Embedgem(string coatingType) { }
        //添加涂层
        public virtual void AddCoating(string cocatingType) { }
        //升级
        public abstract void Upgrade();
        //获取升级后的物品
        public abstract IItem GetItem();
    }
}

using System;
namespace DesignIntegration{
    //具体建造者 - 武器升级
    public class BuildWeaponUpgrade : IItemBuilder{
        private IItemIWeapon _weapon;
        public override IItem GetItem(){
            return _weapon;
        }
        public override void SetBaseItem(IItem item){
            _weapon = item as IItemIWeapon;
        }
        public override void Upgrade(){
            Console.WriteLine($"{_weapon.Name}铸造完成");
        }
        public override void AddMaterial(string material){
            Console.WriteLine($"铸造过程中 添加{material}材料");
        }
        public override void Embedgem(string embedgem){
            Console.WriteLine($"铸造过程中 嵌入{embedgem}宝石");
        }
    }
}
修改抽象武器基类代码

修改jurisdiction建造者代码

using System;
namespace DesignIntegration{
    //具体建造者 - 武器升级
    public class BuildWeaponUpgrade : IItemBuilder{
        private IItemIWeapon _weapon;
        public override IItem GetItem(){
            return _weapon;
        }
        public override void SetBaseItem(IItem item){
            _weapon = item as IItemIWeapon;
        }
        public override void Upgrade(){
            Console.WriteLine($"{_weapon.Name}铸造完成");
            //要抽象不要实现 待完善
            _weapon.AttackValue *= 1.2f;
            _weapon.Durability *= 1.1f;
        }
        public override void AddMaterial(string material){
            Console.WriteLine($"铸造过程中 添加{material}材料");
        }
        public override void Embedgem(string embedgem){
            Console.WriteLine($"铸造过程中 嵌入{embedgem}宝石");
        }
    }
}
 

namespace DesignIntegration{
    //道具指挥者
    public class BuildDirector{
        public IItem Construct(IItemBuilder builder,
            IItem baseItem, string material, string gemType){
            builder.SetBaseItem(baseItem);
            builder.AddMaterial(material);
            builder.Embedgem(gemType);
            builder.Upgrade();
            return builder.GetItem();
        }
    }
}

namespace DesignIntegration{
    public class Program{
        public static void Main(string[] args){
            //TimeManager.Instance.Greet();
            IRole monster = new RoleMonster("Bug兽",20001,60f,20f);
            //剑培
            IItem sword = new IWeaponSword("火焰圣剑", 50001, "中级武器", 15f);
            //((IItemIWeapon)sword).SetWeaponAction(new ActionSweepHorizontally("横扫千钧"));
            //切换新动作
            //((IItemIWeapon)sword).SetWeaponAction(new ActionRaise("下劈"));
            //((IItemIWeapon)sword).Attack(monster);
            IRole player = new RolePlayer("小虎", 10001, 30f, 5f);
            player.UseItem(sword);
            player.SetUseItemAction(new ActionSweepHorizontally("横扫千钧"));
            player.Attack(monster);
            player.SetUseItemAction(new ActionRaise("下劈"));
            player.Attack(monster);
            monster.Attack(player);
            IItem redpotion = new IPotionRed("生命药水", 50101, "加血药瓶", 50f);
            player.UseItem(redpotion);
            var weaponBuilder = new BuildWeaponUpgrade();
            var director = new BuildDirector();
            var upgradedSword = director.Construct(weaponBuilder, sword, "千年玄晶", "红宝石");
        }
    }
}

using System;

namespace DesignIntegration{
    public class Program{
        public static void Main(string[] args){
            //TimeManager.Instance.Greet();
            IRole monster = new RoleMonster("Bug兽",20001,60f,20f);
            //剑培
            IItem sword = new IWeaponSword("火焰圣剑", 50001, "中级武器", 15f);
            //((IItemIWeapon)sword).SetWeaponAction(new ActionSweepHorizontally("横扫千钧"));
            //切换新动作
            //((IItemIWeapon)sword).SetWeaponAction(new ActionRaise("下劈"));
            //((IItemIWeapon)sword).Attack(monster);
            IRole player = new RolePlayer("小虎", 10001, 30f, 5f);
            player.UseItem(sword);
            player.SetUseItemAction(new ActionSweepHorizontally("横扫千钧"));
            player.Attack(monster);
            player.SetUseItemAction(new ActionRaise("下劈"));
            player.Attack(monster);
            monster.Attack(player);
            IItem redpotion = new IPotionRed("生命药水", 50101, "加血药瓶", 50f);
            player.UseItem(redpotion);
            var weaponBuilder = new BuildWeaponUpgrade();
            var director = new BuildDirector();
            var upgradedSword = director.Construct(weaponBuilder, sword, "千年玄晶", "红宝石") as IItemIWeapon;
            Console.WriteLine($"铸造后的攻击力是{upgradedSword.AttackValue}");
        }
    }
}

【||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||装饰者模式||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||】

namespace DesignIntegration{
    public interface IEnhancer{
        //装饰者模式接口
        void ApplyEffect(IRole role);
    }
}

using System;
namespace DesignIntegration{
    public class EnhancerFrozenEffect : IEnhancer{
        private float _freezeChance;//冰冻几率
        public EnhancerFrozenEffect(float freezeChance){
            _freezeChance = freezeChance;
        }
        public void ApplyEffect(IRole role){
            float randomValue = new Random().Next(0,100)/100f;
            if (randomValue < _freezeChance){
                Console.WriteLine($"{role.Name}被冰冻了");
                //角色内应有被冰冻的状态
                //role.Freeze();
            }
            else {
                Console.WriteLine("冰冻失败");
            }
        }
    }
}

namespace DesignIntegration{
    //抽象装饰类
    public class IWeaponEnhanced : IItemIWeapon{
        //增强功能接口引用
        private IEnhancer _enhancer = null;
        public IWeaponEnhanced(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        //设置增强配件
        public void SetEnhancer(IEnhancer enhancer) {
            _enhancer= enhancer;
        }
        public override void Attack(IRole role){
            //额外增加魔法攻击
            if(_enhancer != null)
                _enhancer.ApplyEffect(role);
            //写法等同
            //_enhancer?.ApplyEffect(role);
        }
    }
}

using System;
namespace DesignIntegration{
    public class EnhancerFrozenMagicSword : IWeaponEnhanced{
        public EnhancerFrozenMagicSword(string name, int iD, string description,
            float attackValue) : base(name, iD, description, attackValue){
        }
        public override void Attack(IRole role){
            if (_action == null)
                Console.WriteLine($"{Name}发动攻击");
            else{
                //播放动作动画
                _action.Behaviour();
                Console.WriteLine($"{Name}发动攻击");
            }
            //受攻击方减血
            role.TakeDamage(AttackValue);
            //增强魔法效果
            base.Attack(role);
        }
    }
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/127344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现游戏分享网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现游戏分享网站演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到…

windows内存取证-中等难度-下篇

上文我们对第一台Target机器进行内存取证&#xff0c;今天我们继续往下学习&#xff0c;内存镜像请从上篇获取&#xff0c;这里不再进行赘述​ Gideon 攻击者访问了“Gideon”&#xff0c;他们向AllSafeCyberSec域控制器窃取文件,他们使用的密码是什么&#xff1f; 攻击者执…

Python-文件操作

目录 一、文件的打开与关闭 1、文件的打开 2、文件模式 3、文件的关闭 二、文件的读写 1、写文件 2、读文件 3、文件的定位读写 三、文件的重命名和删除 1、文件的重命名 2、文件的删除 四、文件夹的相关操作 1、创建文件夹 2、获取当前目录 3、改变默认目录 4、…

Linux-----nginx的简介,nginx搭载负载均衡以及nginx部署前后端分离项目

目录 nginx的简介 是什么 nginx的特点以及功能 Nginx负载均衡 下载 安装 负载均衡 nginx的简介 是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它的设计目标是为了解决C10k问题&#xff0c;即在同一时间内支持上万个并发连接。 Nginx采用事件驱动的异…

JAVA数据类型分类及初始默认值(详细)

前言 在学习Java的时候会接触到数据类型&#xff0c;那么在Java中有哪些数据类型呢&#xff1f; Java数据类型主要分为两大类 1.基本类型&#xff08;primitive type&#xff09;2.引用类型&#xff08;reference type&#xff09; 1.基本类型里分为&#xff1a;数值类型、…

Hadoop相关知识点

文章目录 一、主要命令二、配置虚拟机2.1 设置静态ip2.2 修改主机名及映射2.3 修改映射2.4 单机模式2.5 伪分布式2.6 完全分布式 三、初识Hadoop四、三种模式的区别4.1、单机模式与伪分布式模式的区别4.2、特点4.3、配置文件的差异4.3.1、单机模式4.3.2、伪分布式模式4.3.3、完…

平面波向球面波的展开

平面波向球面波的展开是一个极其重要的话题 手稿放在文章的结尾处 勒让德展开 citation 1: 我们整理一下&#xff0c;对exp(x)做泰勒展开&#xff0c;得 citation 2: 我们先把精力集中到解决这个积分上去 反复利用分部积分 考虑到奇偶性问题 当且仅当时积分不为零现在做变换 …

解决Windows Server 2012 由于没有远程桌面授权服务器可以提供需求可证

刚开始提示 之后就登录不了 &#xff08;如下图提示&#xff09; 由于windows server 2012 R2 安装了 远程桌面角色&#xff0c;但是这个角色是120天免费的&#xff0c;需要购买授权的。解决方法是取消/删除这个角色&#xff0c;就可以恢复正常的远程 一直下一步 远程桌面服…

IDEA使用-通过Database面板访问数据库

文章目录 前言操作过程注意事项1.无法下载驱动2.“Database”面板不显示数据库表总结前言 作为一款强大IDE工具,IDEA具有很多功能,本文将以MariaDB数据库访问为例,详细介绍如何通过IDE工具的Database面板来访问数据库。 操作过程 不同的版本操作会略有差异,这里我们用于演…

【JavaScript保姆级教程】switch分支与while循环

文章目录 前言一、Switch分支1.1 switch基本结构1.2 break语句1.3 default标签1.4 下面是几个Switch分支的示例代码&#xff1a;示例1: 根据星期数输出对应的中文星期名称示例2: 根据用户输入的颜色选择执行不同的操作 二、While循环&#xff1a;2.1 while循环基本格式2.2 cont…

一文速通Sentinel熔断及降级规则

目录 基本介绍 熔断模式 状态机的三个状态 熔断降级规则 断路器熔断策略 慢调用 异常比例 异常数 基本介绍 熔断模式 主要是参考电路熔断&#xff0c;如果一条线路电压过高&#xff0c;保险丝会熔断&#xff0c;防止火灾。放到我们的系统中&#xff0c;如果某个目标…

云安全-云原生基于容器漏洞的逃逸自动化手法(CDK check)

0x00 docker逃逸的方法种类 1、不安全的配置&#xff1a; 容器危险挂载&#xff08;挂载procfs&#xff0c;Scoket&#xff09; 特权模式启动的提权&#xff08;privileged&#xff09; 2、docker容器自身的漏洞 3、linux系统内核漏洞 这里参考Twiki的云安全博客&#xff0c;下…

【通关选择】upload-labs通关攻略(全)

前提条件&#xff1a; 1.文件能够成功上传到服务器 2.攻击者能够知道文件的上传路径 upload-labs靶场 Pass-01&#xff08; 前端验证&#xff09; 三种方法解决思路 1.禁用客户端JavaScript弹窗 2.通过burp抓包&#xff0c;修改后缀名 3.f12删除return filecheck&#xff0…

测试用例设计——WEB通用测试用例

现在项目做完了&#xff0c;我觉得还是有必要总结一下&#xff0c;学习到的内容。毕竟有总结才能有提高嘛&#xff01;总结一下通用的东西&#xff0c;不管什么项目基本都可能会遇到&#xff0c;有写地方也有重复的或者有的是按照个人的习惯来总结的不一定都对&#xff0c;有不…

【深度学习】pytorch——实现CIFAR-10数据集的分类

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 往期文章&#xff1a; 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…

HTML区块、布局

HTML区块&#xff1a; HTML可以通过<div> 和 <span>将元素组合起来。大多数HTML元素被定义为块级元素或内联元素。块级元素在浏览器显示时&#xff0c;通常会以新行来开始、结束&#xff1b;内联元素在显示时通常不会以新行开始。 HTML<div>元素是块级元素…

JavaWeb 怎么在servlet向页面输出Html元素?

service()方法里面的方法体&#xff1a; resp.setContentType("text/html;charsetutf-8");//获得输出流PrintWriter对象PrintWriter outresp.getWriter();out.println("<html>");out.println("<head><title>a servlet</title>…

docker部署minio并使用springboot连接

需求&#xff1a;工作中&#xff0c;在微信小程序播放时&#xff0c;返回文件流并不能有效的使用&#xff0c;前端需要一个可以访问的地址&#xff0c;springboot默认是有资源拦截器的&#xff0c;但是不适合生产环境的使用 可以提供使用的有例如fastdfs或者minio&#xff0c;这…

Qt实现的自定义登录框连接MySQL(完整的实现过程)

一.开始创建项目 1.创建Qt窗口应用项目: 2.输入文件名、选择项目将要保存的地址 3.构造系统选择qmake 4.类名使用默认的就好,点击继续完成项目的创建 5.创建好的项目如下 二.创建一个资源管理文件 三.创建一个登录对话框窗口 1.选择一个ui界面类 2.选择Dialog without Butt…

git生成gitee和github两个不同的公钥

配置多个公钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、生成公钥文件&#xff1a; 通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t rsa -C "Gitee SSH Key" -f ~/.ssh/gitee_be…