原文节选,出自两汉乐府诗集的《陌上桑》
日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。行者见罗敷,下担捋髭须。少年见罗敷,脱帽著帩头。耕者忘其犁,锄者忘其锄。来归相怨怒,但坐观罗敷。(喜蚕桑 译作:善蚕桑;相怨怒 译作:相怒怨)
使君从南来,五马立踟蹰。使君遣吏往,问是谁家姝?“秦氏有好女,自名为罗敷。”“罗敷年几何?”“二十尚不足,十五颇有余”。使君谢罗敷:“宁可共载不?”罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”
“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋。坐中数千人,皆言夫婿殊。”(白晰 译作:白皙)
通过上面诗集分析,展现了古人对美女的欣赏标准。
今天我们使用 C#
程序重温鉴赏一次,分析主角 罗敷
的描写:
- 外貌描写:
头发:“头上倭堕髻”,形容罗敷的发型优美,倭堕髻是一种流行的发髻样式。
耳朵:“耳中明月珠”,佩戴珍贵的明珠,显示其高贵和美丽。
服饰:“缃绮为下裙,紫绮为上襦”,穿着华丽的丝绸衣服,颜色搭配得体,显示出她的高雅和精致。
- 气质描写:
勤劳:“罗敷善蚕桑,采桑城南隅”,罗敷不仅美丽,还勤劳能干,善于蚕桑。
端庄:尽管她美丽动人,但行为举止端庄大方,没有轻浮之态。
- 社会影响:
行者见罗敷,下担捋髭须:路人见到罗敷,放下担子,捋着胡须欣赏,表现出她的魅力之大。
少年见罗敷,脱帽著帩头:年轻男子见到罗敷,脱下帽子,整理衣冠,表现出对她的倾慕。
耕者忘其犁,锄者忘其锄:农夫们见到罗敷,忘记了手中的农活,表现出她的美貌令人陶醉。
有意思的是 “社会影响”,通过分析我们采用 C#
语言的 工厂模式
结合 单例模式
来分别 “鉴赏” 诗歌之美:
说明:下面的分析纯属虚构,配合剧本(C#)设计而已,英雄所见略同…略同… 😃
此处主要是为了演示 工厂方法模式
(FactoryMethod
,即一般工厂模式)的应用案例。
程序实现的总体概述:
- Constructor - SingletonConstructorByLazy,泛型单利构造器
- Factory- ICreator ,工厂定义- ConcreteCreator ,基于 ICreator 规范的具体工厂
- Protagonist- ILuoFu,规范定义- LuoFu,主角罗敷实现 ILuoFu- Adorer,配角实现 ILuoFu ,代表官吏史君和夫婿
- PasserBys- IPasserBy,观众的定义- 基于 IPasserBy 标准的具体实现,XingZhe(行者),ShaoNian(少年),GenZhe(耕者),ChuZhe(锄者)
1、首先我们把这些人物类型抽象定义
- 围绕主角
罗敷
相关人物的定义
internal interface ILuoFu
{/// <summary>/// 个人简介/// </summary>/// <param name="str"></param>void Profile(string str);/// <summary>/// 会话/// </summary>/// <param name="str"></param>void Say(string str);
}
- 主角
罗敷
的具体实现
internal sealed class LuoFu : SingletonConstructorByLazy<LuoFu>, ILuoFu
{public bool IsCaiSang { get; private set; } public void SetIsCaiSang(bool isCaiSang){IsCaiSang = isCaiSang;}#region ILuoFupublic void Profile(string str) => Console.WriteLine(str);public void Say(string str) => Console.WriteLine(str);#endregion
}
- 配角具体实现
using ConsoleApp2.Constructor;namespace ConsoleApp2.Protagonist;internal sealed class Adorer : SingletonConstructorByLazy<Adorer>, ILuoFu
{#region ILuoFupublic void Profile(string str) => Console.WriteLine(str);public void Say(string str) => Console.WriteLine(str);#endregion
}
2、创建泛型单例构造器
namespace ConsoleApp2.Constructor;internal abstract class SingletonConstructorByLazy<TSingle> where TSingle : class, new()
{/// <summary>/// 加了Lazy之后,只有当使用到的时候才加载/// </summary>private static Lazy<TSingle> Single => new(() => new TSingle());public static TSingle SingleInstance => Single.Value;
}
3、 观众定义和实现
# 3.1 观众定义
using ConsoleApp2.Protagonist;namespace ConsoleApp2.PasserBys;internal interface IPasserBy
{/// <summary>/// 人员类型/// </summary>public string PasserType { get; }/// <summary>/// 看见罗敷的行为表现/// </summary>/// <param name="luoFu"></param>public void Comport(LuoFu luoFu);
}# 3.1 观众实现,均继承泛型单例构造器并实现 IPasserBy
# 包括:XingZhe(行者),ShaoNian(少年),GenZhe(耕者),ChuZhe(锄者)internal sealed class XingZhe : SingletonConstructorByLazy<XingZhe>, IPasserBy
{public string PasserType => "行者";public void Comport(LuoFu luoFu){if (luoFu.IsCaiSang)Console.WriteLine("下担捋髭须。");}
}
---
internal sealed class ShaoNian : SingletonConstructorByLazy<ShaoNian>, IPasserBy
{public string PasserType => "少年";public void Comport(LuoFu luoFu){if (luoFu.IsCaiSang)Console.WriteLine("脱帽著帩头。");}
}
---
internal sealed class GenZhe : SingletonConstructorByLazy<GenZhe>, IPasserBy
{public string PasserType => "耕者";public void Comport(LuoFu luoFu){if (luoFu.IsCaiSang)Console.WriteLine("忘其犁");}
}
---
internal sealed class ChuZhe : SingletonConstructorByLazy<ChuZhe>, IPasserBy
{public string PasserType => "锄者";public void Comport(LuoFu luoFu){if (luoFu.IsCaiSang)Console.WriteLine("忘其锄");}
}
4、创建一个工厂(Factory)
# 工厂规范定义
using ConsoleApp2.PasserBys;namespace ConsoleApp2.Factory;internal interface ICreator
{public IPasserBy CreatePasserBy<TClass>() where TClass : IPasserBy;
}# 工厂规范实现
internal sealed class ConcreteCreator : SingletonConstructorByLazy<ConcreteCreator>, ICreator
{public IPasserBy CreatePasserBy<TClass>() where TClass : IPasserBy{//IPasserBy passerBy = default!;var tName = typeof(TClass).Name;IPasserBy passerBy = tName switch{nameof(XingZhe) => XingZhe.SingleInstance,nameof(ShaoNian) => ShaoNian.SingleInstance,nameof(GenZhe) => GenZhe.SingleInstance,nameof(ChuZhe) => ChuZhe.SingleInstance,_ => throw new NotImplementedException($"{tName} 类型暂未实现!")};return passerBy;}
}
5、应用单例模式和工厂模式,解析诗歌集
在 Program.cs
中,我们这样应用。
using ConsoleApp2.Factory;
using ConsoleApp2.PasserBys;
using ConsoleApp2.Protagonist;namespace ConsoleApp2;internal class Program
{static void Main(string[] args){Console.WriteLine("======欢迎来到 C# 诗歌集赏析大会======");Console.WriteLine("1.主角入场:");var luoFu = LuoFu.SingleInstance;// 1. 初始化罗敷采桑于luoFu.SetIsCaiSang(true);// 2. 罗敷简介string lufuInfo = "日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。";luoFu.Profile(lufuInfo);Console.WriteLine("2.观众入场:");// 单例方式//IPasserBy xinzhe = XingZhe.SingleInstance;//xinzhe.Comport(luoFu);// 单例方式 & 工厂方式var concreteCreator = ConcreteCreator.SingleInstance;PasserFactory(concreteCreator, luoFu, XingZhe.SingleInstance);PasserFactory(concreteCreator, luoFu, ShaoNian.SingleInstance);PasserFactory(concreteCreator, luoFu, GenZhe.SingleInstance);PasserFactory(concreteCreator, luoFu, ChuZhe.SingleInstance);Console.WriteLine("来归相怨怒,但坐观罗敷。(喜蚕桑 一作:善蚕桑;相怨怒 一作:相怒怨)");Console.WriteLine("3.官吏入场:");// 普通方式var adorer = Adorer.SingleInstance;string shijunInfo = "使君从南来,五马立踟蹰。";adorer.Profile(shijunInfo);Console.WriteLine("使君遣吏往,问是谁家姝?");luoFu.Say("罗敷说:“秦氏有好女,自名为罗敷。”");Console.WriteLine("小吏说:“罗敷年几何?”");luoFu.Say("罗敷说:“二十尚不足,十五颇有余”");adorer.Say("使君谢罗敷:“宁可共载不?”");luoFu.Say("罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”");Console.WriteLine("4.夫婿入场:");string fuxuInfo = "“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋。坐中数千人,皆言夫婿殊。”(白晰 一作:白皙)";adorer.Profile(fuxuInfo);adorer.Say("夫婿说:“你个龟儿子,光天化日竟敢...”");}static void PasserFactory<TClass>(ConcreteCreator concreteCreator, LuoFu luoFu, TClass t) where TClass : IPasserBy{IPasserBy passerBy = concreteCreator.CreatePasserBy<TClass>();Console.Write($"===>{passerBy.PasserType}见罗敷,");passerBy.Comport(luoFu);}
}
运行程序,输出如下信息:
1.主角入场:
日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。 头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。
2.观众入场:
===>行者见罗敷,下担捋髭须。
===>少年见罗敷,脱帽著帩头。
===>耕者见罗敷,忘其犁
===>锄者见罗敷,忘其锄
来归相怨怒,但坐观罗敷。(喜蚕桑 一作:善蚕桑;相怨怒 一作:相怒怨)
3.官吏入场:
使君从南来,五马立踟蹰。
使君遣吏往,问是谁家姝?
罗敷说:“秦氏有好女,自名为罗敷。”
小吏说:“罗敷年几何?”
罗敷说:“二十尚不足,十五颇有余”
使君谢罗敷:“宁可共载不?”
罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”
4.夫婿入场:
“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余 。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋 。坐中数千人,皆言夫婿殊。”(白晰 一作:白皙)
夫婿说:“你个龟儿子,光天化日竟敢...”
再次说明,上面分析纯属个人观点,主要是带入 C#
语言领悟 OOP
的世界,但愿归来还是那个少年…
题《罗敷春晖》—— 汉代乐府《陌上桑》诗意城南采桑春日暖,婉转歌声动四围。
头上倭堕髻如云,耳垂明珠光熠熠。
缃绮紫襦身段好,步履轻盈似仙妃。
少年心慕罗敷美,青丝明月映春晖。行者驻足频回顾,少年含笑整衣冠。
耕者忘犁锄者立,皆为罗敷动心弦。
世间佳丽何其多,独爱罗敷情未央。
春风十里不如你,芳华绝代永难忘。
总结
《陌上桑》
通过对 罗敷
的外貌、气质和社会影响的描写,展现了汉代人们对美女的审美标准。不仅注重外貌的美丽,还强调内在的美德和气质,以及对周围人的吸引力。这种综合的审美观念在当时的社会中具有重要的地位。