• CSharp: Decorator Pattern in donet core 3


     /// <summary>
        ///装饰模式  Decorator Pattern
        ///geovindu,Geovin Du eidt
        ///
        /// </summary>
        abstract class AbstractHome
        {
            /// <summary>
            /// 
            /// </summary>
            public double AdditionalPrice { get; set; }
            /// <summary>
            /// 
            /// </summary>
            public abstract void MakeHome();
        }
    
        /// <summary>
        /// 
        /// </summary>
        class ConcreteHome : AbstractHome
        {
    
            /// <summary>
            /// 
            /// </summary>
            public ConcreteHome()
            {
                AdditionalPrice = 0;
            }
    
            /// <summary>
            /// /
            /// </summary>
            public override void MakeHome()
            {
                Console.WriteLine($"Original House is constructed.Price for this ¥10000(原建房屋价格)");
            }
        }
        /// <summary>
        /// 抽像
        /// </summary>
        abstract class AbstractDecorator : AbstractHome
        {
            protected AbstractHome home;
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="home"></param>
            public AbstractDecorator(AbstractHome home)
            {
                this.home = home;
                this.AdditionalPrice = 0;
            }
    
            /// <summary>
            /// 
            /// </summary>
            public override void MakeHome()
            {
                home.MakeHome();//Delegating task 
            }
        }
    
        /// <summary>
        /// Floor Decorator is used to add a floor   
        /// 地板
        /// </summary>
        class FloorDecorator : AbstractDecorator
        {
    
            /// <summary>
            /// 地板价格
            /// </summary>
            /// <param name="home"></param>
            public FloorDecorator(AbstractHome home) : base(home)
            {
                this.AdditionalPrice = 2500;
            }
    
            /// <summary>
            /// 
            /// </summary>
            public override void MakeHome()
            {
                base.MakeHome();
                //Adding a floor on top of original house.
                AddFloor();
            }
    
            /// <summary>
            /// 添加地板
            /// </summary>
            private void AddFloor()
            {
                Console.WriteLine($"-Additional Floor(添加地板) added.Pay additional ¥{AdditionalPrice} for it .");
            }
        }
    
        ///<summary>
        ///Paint Decorator is used to paint the home. 
        ///涂装
        /// </summary>   
        class PaintDecorator : AbstractDecorator
        {
    
            /// <summary>
            /// 涂装价格
            /// </summary>
            /// <param name="home"></param>
            public PaintDecorator(AbstractHome home) : base(home)
            {
                //this.home = home;
                this.AdditionalPrice = 5000;
            }
    
            /// <summary>
            /// 
            /// </summary>
            public override void MakeHome()
            {
                base.MakeHome();
                //Painting home.
                PaintHome();
            }
    
            /// <summary>
            /// 涂装
            /// </summary>
            private void PaintHome()
            {
                Console.WriteLine($"--Painting done(涂装修).Pay additional ¥{AdditionalPrice} for it .");
            }
        }
    

      

        /// <summary>
        ///装饰模式  Decorator Pattern
        ///geovindu,Geovin Du eidt
        ///
        /// </summary>
        public class MyStringBuilder
        {
            StringBuilder sb = new StringBuilder();
    
            //=============================================
            /// <summary>
            /// 
            /// </summary>
            /// <param name="s"></param>
            public static implicit operator MyStringBuilder(string s)
            {
                var msb = new MyStringBuilder();
                msb.sb.Append(s);
                return msb;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="msb"></param>
            /// <param name="s"></param>
            /// <returns></returns>
            public static MyStringBuilder operator +(MyStringBuilder msb, string s)
            {
                msb.Append(s);
                return msb;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return sb.ToString();
            }
    
            //=============================================
            /// <summary>
            /// 
            /// </summary>
            /// <param name="info"></param>
            /// <param name="context"></param>
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                ((ISerializable)sb).GetObjectData(info, context);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="capacity"></param>
            /// <returns></returns>
            public int EnsureCapacity(int capacity)
            {
                return sb.EnsureCapacity(capacity);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="startIndex"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            public string ToString(int startIndex, int length)
            {
                return sb.ToString(startIndex, length);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public StringBuilder Clear()
            {
                return sb.Clear();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="repeatCount"></param>
            /// <returns></returns>
            public StringBuilder Append(char value, int repeatCount)
            {
                return sb.Append(value, repeatCount);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="charCount"></param>
            /// <returns></returns>
            public StringBuilder Append(char[] value, int startIndex, int charCount)
            {
                return sb.Append(value, startIndex, charCount);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(string value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public StringBuilder Append(string value, int startIndex, int count)
            {
                return sb.Append(value, startIndex, count);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public StringBuilder AppendLine()
            {
                return sb.AppendLine();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder AppendLine(string value)
            {
                return sb.AppendLine(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sourceIndex"></param>
            /// <param name="destination"></param>
            /// <param name="destinationIndex"></param>
            /// <param name="count"></param>
            public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
            {
                sb.CopyTo(sourceIndex, destination, destinationIndex, count);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, string value, int count)
            {
                return sb.Insert(index, value, count);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="startIndex"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            public StringBuilder Remove(int startIndex, int length)
            {
                return sb.Remove(startIndex, length);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(bool value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(sbyte value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(byte value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(char value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(short value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(int value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(long value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(float value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(double value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(decimal value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(ushort value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(uint value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(ulong value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(object value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Append(char[] value)
            {
                return sb.Append(value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, string value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, bool value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, sbyte value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, byte value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, short value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, char value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, char[] value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="charCount"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, char[] value, int startIndex, int charCount)
            {
                return sb.Insert(index, value, startIndex, charCount);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, int value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, long value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, float value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, double value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, decimal value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, ushort value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, uint value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, ulong value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public StringBuilder Insert(int index, object value)
            {
                return sb.Insert(index, value);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(string format, object arg0)
            {
                return sb.AppendFormat(format, arg0);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(string format, object arg0, object arg1)
            {
                return sb.AppendFormat(format, arg0, arg1);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <param name="arg2"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(string format, object arg0, object arg1, object arg2)
            {
                return sb.AppendFormat(format, arg0, arg1, arg2);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(string format, params object[] args)
            {
                return sb.AppendFormat(format, args);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="provider"></param>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0)
            {
                return sb.AppendFormat(provider, format, arg0);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="provider"></param>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0,
              object arg1)
            {
                return sb.AppendFormat(provider, format, arg0, arg1);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="provider"></param>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <param name="arg2"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0,
              object arg1, object arg2)
            {
                return sb.AppendFormat(provider, format, arg0, arg1, arg2);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="provider"></param>
            /// <param name="format"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)
            {
                return sb.AppendFormat(provider, format, args);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldValue"></param>
            /// <param name="newValue"></param>
            /// <returns></returns>
            public StringBuilder Replace(string oldValue, string newValue)
            {
                return sb.Replace(oldValue, newValue);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sb"></param>
            /// <returns></returns>
            public bool Equals(StringBuilder sb)
            {
                return this.sb.Equals(sb);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldValue"></param>
            /// <param name="newValue"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public StringBuilder Replace(string oldValue, string newValue, int startIndex, int count)
            {
                return sb.Replace(oldValue, newValue, startIndex, count);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldChar"></param>
            /// <param name="newChar"></param>
            /// <returns></returns>
            public StringBuilder Replace(char oldChar, char newChar)
            {
                return sb.Replace(oldChar, newChar);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldChar"></param>
            /// <param name="newChar"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public StringBuilder Replace(char oldChar, char newChar, int startIndex, int count)
            {
                return sb.Replace(oldChar, newChar, startIndex, count);
            }
            /// <summary>
            /// 
            /// </summary>
            public int Capacity
            {
                get => sb.Capacity;
                set => sb.Capacity = value;
            }
            /// <summary>
            /// 
            /// </summary>
            public int MaxCapacity => sb.MaxCapacity;
            /// <summary>
            /// 
            /// </summary>
            public int Length
            {
                get => sb.Length;
                set => sb.Length = value;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <returns></returns>
            public char this[int index]
            {
                get => sb[index];
                set => sb[index] = value;
            }
        }
    

      

     /// <summary>
        ///装饰模式  Decorator Pattern
        ///geovindu,Geovin Du eidt
        ///
        /// </summary>
        public class CodeBuilder
        {
            private StringBuilder builder = new StringBuilder();
            private int indentLevel = 0;
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public CodeBuilder Indent()
            {
                indentLevel++;
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string ToString()
            {
                return builder.ToString();
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="info"></param>
            /// <param name="context"></param>
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                ((ISerializable)builder).GetObjectData(info, context);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="capacity"></param>
            /// <returns></returns>
            public int EnsureCapacity(int capacity)
            {
                return builder.EnsureCapacity(capacity);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="startIndex"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            public string ToString(int startIndex, int length)
            {
                return builder.ToString(startIndex, length);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public CodeBuilder Clear()
            {
                builder.Clear();
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="repeatCount"></param>
            /// <returns></returns>
            public CodeBuilder Append(char value, int repeatCount)
            {
                builder.Append(value, repeatCount);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="charCount"></param>
            /// <returns></returns>
            public CodeBuilder Append(char[] value, int startIndex, int charCount)
            {
                builder.Append(value, startIndex, charCount);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(string value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public CodeBuilder Append(string value, int startIndex, int count)
            {
                builder.Append(value, startIndex, count);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public CodeBuilder AppendLine()
            {
                builder.AppendLine();
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder AppendLine(string value)
            {
                builder.AppendLine(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sourceIndex"></param>
            /// <param name="destination"></param>
            /// <param name="destinationIndex"></param>
            /// <param name="count"></param>
            public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
            {
                builder.CopyTo(sourceIndex, destination, destinationIndex, count);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, string value, int count)
            {
                builder.Insert(index, value, count);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="startIndex"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            public CodeBuilder Remove(int startIndex, int length)
            {
                builder.Remove(startIndex, length);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(bool value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(sbyte value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(byte value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(char value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(short value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(int value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(long value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(float value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(double value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(decimal value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(ushort value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(uint value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(ulong value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(object value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Append(char[] value)
            {
                builder.Append(value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, string value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, bool value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, sbyte value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, byte value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, short value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, char value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, char[] value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <param name="startIndex"></param>
            /// <param name="charCount"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, char[] value, int startIndex, int charCount)
            {
                builder.Insert(index, value, startIndex, charCount);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, int value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, long value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, float value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, double value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, decimal value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, ushort value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, uint value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, ulong value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public CodeBuilder Insert(int index, object value)
            {
                builder.Insert(index, value);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <returns></returns>
            public CodeBuilder AppendFormat(string format, object arg0)
            {
                builder.AppendFormat(format, arg0);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <returns></returns>
            public CodeBuilder AppendFormat(string format, object arg0, object arg1)
            {
                builder.AppendFormat(format, arg0, arg1);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="arg0"></param>
            /// <param name="arg1"></param>
            /// <param name="arg2"></param>
            /// <returns></returns>
            public CodeBuilder AppendFormat(string format, object arg0, object arg1, object arg2)
            {
                builder.AppendFormat(format, arg0, arg1, arg2);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="format"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            public CodeBuilder AppendFormat(string format, params object[] args)
            {
                builder.AppendFormat(format, args);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="provider"></param>
            /// <param name="format"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            public CodeBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)
            {
                builder.AppendFormat(provider, format, args);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldValue"></param>
            /// <param name="newValue"></param>
            /// <returns></returns>
            public CodeBuilder Replace(string oldValue, string newValue)
            {
                builder.Replace(oldValue, newValue);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="sb"></param>
            /// <returns></returns>
            public bool Equals(CodeBuilder sb)
            {
                return builder.Equals(sb);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldValue"></param>
            /// <param name="newValue"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public CodeBuilder Replace(string oldValue, string newValue, int startIndex, int count)
            {
                builder.Replace(oldValue, newValue, startIndex, count);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldChar"></param>
            /// <param name="newChar"></param>
            /// <returns></returns>
            public CodeBuilder Replace(char oldChar, char newChar)
            {
                builder.Replace(oldChar, newChar);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="oldChar"></param>
            /// <param name="newChar"></param>
            /// <param name="startIndex"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public CodeBuilder Replace(char oldChar, char newChar, int startIndex, int count)
            {
                builder.Replace(oldChar, newChar, startIndex, count);
                return this;
            }
            /// <summary>
            /// 
            /// </summary>
            public int Capacity
            {
                get => builder.Capacity;
                set => builder.Capacity = value;
            }
            /// <summary>
            /// 
            /// </summary>
            public int MaxCapacity => builder.MaxCapacity;
            /// <summary>
            /// 
            /// </summary>
            public int Length
            {
                get => builder.Length;
                set => builder.Length = value;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="index"></param>
            /// <returns></returns>
            public char this[int index]
            {
                get => builder[index];
                set => builder[index] = value;
            }
        }
    

      

     /// <summary>
        ///装饰模式  Decorator Pattern
        ///geovindu,Geovin Du eidt
        ///
        /// </summary>
        public abstract class Shape
        {
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public virtual string AsString() => string.Empty;
        }
        /// <summary>
        /// 
        /// </summary>
        public sealed class Circle : Shape
        {
            private float radius;
            /// <summary>
            /// 
            /// </summary>
            public Circle() : this(0)
            {
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="radius"></param>
            public Circle(float radius)
            {
                this.radius = radius;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="factor"></param>
            public void Resize(float factor)
            {
                radius *= factor;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string AsString() => $"A circle of radius {radius}";
        }
        /// <summary>
        /// 
        /// </summary>
        public sealed class Square : Shape
        {
            private readonly float side;
            /// <summary>
            /// 
            /// </summary>
            public Square() : this(0)
            {
    
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="side"></param>
            public Square(float side)
            {
                this.side = side;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string AsString() => $"A square with side {side}";
        }
    
        /// <summary>
        ///  dynamic
        /// </summary>
        public class ColoredShape : Shape
        {
            private readonly Shape shape;
            private readonly string color;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="shape"></param>
            /// <param name="color"></param>
            public ColoredShape(Shape shape, string color)
            {
                this.shape = shape;
                this.color = color;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string AsString() => $"{shape.AsString()} has the color {color}";
        }
        /// <summary>
        /// 
        /// </summary>
        public class TransparentShape : Shape
        {
            private readonly Shape shape;
            private readonly float transparency;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="shape"></param>
            /// <param name="transparency"></param>
            public TransparentShape(Shape shape, float transparency)
            {
                this.shape = shape;
                this.transparency = transparency;
            }
    
            public override string AsString() =>
              $"{shape.AsString()} has {transparency * 100.0f}% transparency";
        }
    
        // CRTP cannot be done
        //public class ColoredShape2<T> : T where T : Shape { }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ColoredShape<T> : Shape
          where T : Shape, new()
        {
            private readonly string color;
            private readonly T shape = new T();
            /// <summary>
            /// 
            /// </summary>
            public ColoredShape() : this("black")
            {
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="color"></param>
    
            public ColoredShape(string color) // no constructor forwarding
            {
                this.color = color;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string AsString()
            {
                return $"{shape.AsString()} has the color {color}";
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class TransparentShape<T> : Shape where T : Shape, new()
        {
            private readonly float transparency;
            private readonly T shape = new T();
            /// <summary>
            /// 
            /// </summary>
            /// <param name="transparency"></param>
            public TransparentShape(float transparency)
            {
                this.transparency = transparency;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public override string AsString()
            {
                return $"{shape.AsString()} has transparency {transparency * 100.0f}";
            }
        }
    

      

    调用:

     //装饰模式  Decorator Pattern
                Console.WriteLine("***装饰模式Decorator pattern Demo***\n");
                #region Scenario-1
                Console.WriteLine("\n**Scenario-1:");
                Console.WriteLine("**Building home.Adding floor and then painting it.**");
                
                AbstractHome home = new ConcreteHome();
                Console.WriteLine("Current bill breakups are as follows:");
                home.MakeHome();
    
                //Applying a decorator
                //Adding a floor
                home = new FloorDecorator(home);
                Console.WriteLine("\nFloor added.Current bill breakups are as follows:");
                home.MakeHome();
    
                //Working on top of previous decorator.
                //Painting the home 
                home = new PaintDecorator(home);
                Console.WriteLine("\nPaint applied.Current bill breakups are as follows:");
                home.MakeHome();
                #endregion
    
                #region Scenario-2
                Console.WriteLine("\n**Scenario-2:");
                Console.WriteLine("**Building home,painting it and then adding two additional floors on top of it.**");
                //Fresh start once again.
                home = new ConcreteHome();
                Console.WriteLine("\nGoing back to original home.Current bill breakups are as follows:");
                home.MakeHome();
    
                //Applying paint on original home.
                home = new PaintDecorator(home);
                Console.WriteLine("\nPaint applied.Current bill breakups are as follows:");
                home.MakeHome();
    
                //Adding a floor on the painted home.
                home = new FloorDecorator(home);
                Console.WriteLine("\nFloor added.Current bill breakups are as follows:");
                home.MakeHome();
    
                //Adding another floor on the current home.
                home = new FloorDecorator(home);
                Console.WriteLine("\nFloor added.Current bill breakups are as follows:");
                home.MakeHome();
                #endregion
    
                //
                MyStringBuilder s = "hello, ";
                s += "Geovin Du, how du you do?"; // will work even without op+ in MyStringBuilder
                              // why? you figure it out!
                Console.WriteLine(s);
    
                //
    
                var cb = new CodeBuilder();
                cb.AppendLine("class Foo")
                  .AppendLine("{")
                  .AppendLine("   void geovindu(); ")
                  .AppendLine("}");
                Console.WriteLine(cb);
    
                //
                var circle = new Circle(2);
                Console.WriteLine(circle.AsString());
    
                var redCircle = new ColoredShape(circle, "red");
                Console.WriteLine(redCircle.AsString());
    
                var redHalfTransparentSquare = new TransparentShape(redCircle, 0.5f);
                Console.WriteLine(redHalfTransparentSquare.AsString());
    
                // static
                ColoredShape<Circle> blueCircle = new ColoredShape<Circle>("blue");
                Console.WriteLine(blueCircle.AsString());
                // A circle of radius 0 has the color blue
    
                TransparentShape<ColoredShape<Square>> blackHalfSquare = new TransparentShape<ColoredShape<Square>>(0.4f);
                Console.WriteLine(blackHalfSquare.AsString());
                // A square with side 0 has the color black has transparency 40
    
                Console.ReadKey();
    

      

    输出:

    ***装饰模式Decorator pattern Demo***
    
    
    **Scenario-1:
    **Building home.Adding floor and then painting it.**
    Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    
    Floor added.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    -Additional Floor(添加地板) added.Pay additional ¥2500 for it .
    
    Paint applied.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    -Additional Floor(添加地板) added.Pay additional ¥2500 for it .
    --Painting done(涂装修).Pay additional ¥5000 for it .
    
    **Scenario-2:
    **Building home,painting it and then adding two additional floors on top of it.**
    
    Going back to original home.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    
    Paint applied.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    --Painting done(涂装修).Pay additional ¥5000 for it .
    
    Floor added.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    --Painting done(涂装修).Pay additional ¥5000 for it .
    -Additional Floor(添加地板) added.Pay additional ¥2500 for it .
    
    Floor added.Current bill breakups are as follows:
    Original House is constructed.Price for this ¥10000(原建房屋价格)
    --Painting done(涂装修).Pay additional ¥5000 for it .
    -Additional Floor(添加地板) added.Pay additional ¥2500 for it .
    -Additional Floor(添加地板) added.Pay additional ¥2500 for it .
    hello, Geovin Du, how du you do?
    class Foo
    {
       void geovindu();
    }
    
    A circle of radius 2
    A circle of radius 2 has the color red
    A circle of radius 2 has the color red has 50% transparency
    A circle of radius 0 has the color blue
    A square with side 0 has the color black has transparency 40
    

      

    1.Creational Design Pattern

    Factory Method
    Abstract Factory
    Builder
    Prototype
    Singleton
    2.Structural Design Patterns

    Adapter
    Bridge
    Composite
    Decorator
    Façade
    Flyweight
    Proxy
    3.Behavioral Design Patterns
    Chain of Responsibility
    Command
    Interpreter
    Iterator
    Mediator
    Memento
    Observer
    State
    Strategy
    Visitor
    Template Method

     

  • 相关阅读:
    数学趣题——汉诺塔
    数学趣题——选美比赛
    数学趣题——计算组合数
    (结构型模式)Proxy——代理模式
    SHELL脚本的基础知识2——使用结构化命令
    数学趣题——寻找假币
    Cocoa使用自定义对话框的方法
    回调函数
    ObjectiveC 内存管理(转)
    mac 密码输入框控制——只能输入数字和字母,禁止特殊字符的输入
  • 原文地址:https://www.cnblogs.com/geovindu/p/16755536.html
Copyright © 2020-2023  润新知