C#--设计模式(装饰者模式)

对一个对象的功能进行扩展,不用改变原有状态,通过创建一个类包装之前的对象。
例题:女生爱化妆,原型是一个女生,底妆类包裹原型,画眉类包裹原型,眼影类包裹原型,口红类包裹原型,最终得到一个画了美美妆的漂亮女生了。
在HeadFirst中,原型为浓咖啡,淡咖啡,通过奶泡等一系列配料做成咖啡。也就是原型的价格不断被装饰类进行包裹,最终得到加好配料后得到最终的价格。
C#--设计模式(装饰者模式)_第1张图片

public abstract class IGirl  {
     
    public abstract void Show();
}
public class ConcreateGirl : IGirl
{
     
    public override void Show()
    {
     
        Debug.Log("我是一名女孩");
    }
}
public abstract class DecorateGirl : IGirl {
     
    private IGirl girl;
    public void  SetGirl(IGirl _girl)
    {
     
        this.girl = _girl;
    }
    public override void Show()
    {
     
        if (girl!=null)
        {
     
            girl.Show();
        }
    }
}
public class EyesDecorate : DecorateGirl {
     

    public override void Show()
    {
     
        base.Show();
        AddAction();
    }
    private void AddAction()
    {
     
        Debug.Log("上眼影");
    }
}
public class EyebrowDecorate : DecorateGirl
{
     
 
    public override void Show()
    {
     
        base.Show();
        AddAction();
    }
    public void AddAction()
    {
     
        Debug.Log("画眉毛");
    }
}
public class LipDecorate : DecorateGirl {
     

  
    public override void Show()
    {
     
        base.Show();
        AddAction();
    }
    public void AddAction()
    {
     
        Debug.Log("涂口红");
    }
}
public class TestDecorate : MonoBehaviour {
     

	// Use this for initialization
	void Start () {
     
        IGirl concreateGirl = new ConcreateGirl();
        DecorateGirl eye = new EyesDecorate();
        DecorateGirl lip = new LipDecorate();
        DecorateGirl eyebrow = new EyebrowDecorate();

        eye.SetGirl(concreateGirl);
        lip.SetGirl(eye);
        eyebrow.SetGirl(lip);
        eyebrow.Show();
    }
}

C#--设计模式(装饰者模式)_第2张图片
C#--设计模式(装饰者模式)_第3张图片
缺点:
会造成很多的类。

你可能感兴趣的:(设计模式,设计模式)