C#--设计模式(装饰者模式)
程序员文章站
2022-03-14 10:14:42
...
对一个对象的功能进行扩展,不用改变原有状态,通过创建一个类包装之前的对象。
例题:女生爱化妆,原型是一个女生,底妆类包裹原型,画眉类包裹原型,眼影类包裹原型,口红类包裹原型,最终得到一个画了美美妆的漂亮女生了。
在HeadFirst中,原型为浓咖啡,淡咖啡,通过奶泡等一系列配料做成咖啡。也就是原型的价格不断被装饰类进行包裹,最终得到加好配料后得到最终的价格。
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();
}
}
缺点:
会造成很多的类。