zoukankan      html  css  js  c++  java
  • Unity---游戏设计模式(17)之装饰模式





    参考于:
    《设计模式Head First》

    装饰模式:动态的将责任附加到对象上。若要扩展功能,一般这是个比继承更有弹性的替代方案。

    设计原则1:类应该对扩展开放,对修改关闭。

    1、装饰模式原型

    装饰模式原型UML

    装饰模式原型代码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class DecorateMode : MonoBehaviour
    {
        private void Start () {
    
            ICoffee coffee1 = new LightCoffee();
            Debug.Log("咖啡容量:" + coffee1.Capacity() + "咖啡价格:" + coffee1.Cost());
    
            coffee1 = coffee1.AddDecorate(new MilkDecorate());
            Debug.Log("添加牛奶后咖啡容量:" + coffee1.Capacity() + "咖啡价格:" + coffee1.Cost());
    
            coffee1 = coffee1.AddDecorate(new PearlDecorate());
            Debug.Log("添加珍珠后咖啡容量:" + coffee1.Capacity() + "咖啡价格:" + coffee1.Cost());
        }
    }
    
    /// <summary>
    /// 咖啡
    /// </summary>
    public abstract class ICoffee
    {
        //咖啡的容量和消费
        public abstract double Capacity();
        public abstract double Cost();
    
        /// <summary>
        /// 给咖啡添加调料,会改变咖啡
        /// </summary>
        public ICoffee AddDecorate(DecorateCoffee decorate)
        {
            decorate.Coffee = this;
            return decorate;
        }
    }
    //淡咖啡和浓咖啡
    public class LightCoffee : ICoffee
    {
        public override double Capacity()
        {
            return 100;
        }
    
        public override double Cost()
        {
            return 20;
        }
    }
    public class StrongCoffee : ICoffee
    {
        public override double Capacity()
        {
            return 150;
        }
    
        public override double Cost()
        {
            return 15;
        }
    }
    
    /// <summary>
    /// 装饰咖啡类
    /// </summary>
    public class DecorateCoffee : ICoffee
    {
        /// <summary>
        /// 要装饰的咖啡对象
        /// </summary>
        protected ICoffee mCoffee;
        public ICoffee Coffee { set { mCoffee = value; } }
    
        public override double Capacity()
        {
            return mCoffee.Capacity();
        }
    
        public override double Cost()
        {
            return mCoffee.Cost();
        }
    }
    
    /// <summary>
    /// 添加牛奶。容量+20,价格+3。
    /// </summary>
    public class MilkDecorate : DecorateCoffee
    {
        public override double Capacity()
        {
            return mCoffee.Capacity() + 20;
        }
    
        public override double Cost()
        {
            return mCoffee.Cost() + 3;
        }
    }
    /// <summary>
    /// 添加珍珠。容量+10,价格+2。
    /// </summary>
    public class PearlDecorate : DecorateCoffee
    {
        public override double Capacity()
        {
            return mCoffee.Capacity() + 10;
        }
    
        public override double Cost()
        {
            return mCoffee.Cost() + 2;
        }
    }
    

    结果

    2、装饰模式优缺点

    优点

    1. 扩展性高,灵活性强。

    缺点

    1. 装饰模式中有大量的小类,会导致类的数量较多。
    2. 某些情况下导入装饰者,可能会出现一些状况。
  • 相关阅读:
    springcloud-Netflix创建服务消费者
    Spring Cloud Zuul
    Spring Cloud 熔断器
    树莓派连接启动SSH
    win10红警黑屏和无法打开的处理
    创建索引和主键
    SQL语句增加字段、修改字段、修改类型、修改默认值
    SQL Server 事务隔离级别详解
    SQL Server数据库锁机制及类型
    SQL Server中的锁类型及用法
  • 原文地址:https://www.cnblogs.com/Fflyqaq/p/11742270.html
Copyright © 2011-2022 走看看