原文节选,出自两汉乐府诗集的《陌上桑》
日出东南隅,照我秦氏楼。秦氏有好女,自名为罗敷。罗敷喜蚕桑,采桑城南隅。青丝为笼系,桂枝为笼钩。头上倭堕髻,耳中明月珠。缃绮为下裙,紫绮为上襦。行者见罗敷,下担捋髭须。少年见罗敷,脱帽著帩头。耕者忘其犁,锄者忘其锄。来归相怨怒,但坐观罗敷。(喜蚕桑 译作:善蚕桑;相怨怒 译作:相怒怨)
使君从南来,五马立踟蹰。使君遣吏往,问是谁家姝?“秦氏有好女,自名为罗敷。”“罗敷年几何?”“二十尚不足,十五颇有余”。使君谢罗敷:“宁可共载不?”罗敷前致辞:“使君一何愚!使君自有妇,罗敷自有夫!”
“东方千余骑,夫婿居上头。何用识夫婿?白马从骊驹,青丝系马尾,黄金络马头;腰中鹿卢剑,可值千万余。十五府小吏,二十朝大夫,三十侍中郎,四十专城居。为人洁白晰,鬑鬑颇有须。盈盈公府步,冉冉府中趋。坐中数千人,皆言夫婿殊。”(白晰 译作:白皙)
通过上面诗集分析,展现了古人对美女的欣赏标准。
今天我们使用 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 ILuoFu
public 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 ILuoFu
public 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
的世界,但愿归来还是那个少年…
题《罗敷春晖》
—— 汉代乐府《陌上桑》诗意
城南采桑春日暖,婉转歌声动四围。
头上倭堕髻如云,耳垂明珠光熠熠。
缃绮紫襦身段好,步履轻盈似仙妃。
少年心慕罗敷美,青丝明月映春晖。
行者驻足频回顾,少年含笑整衣冠。
耕者忘犁锄者立,皆为罗敷动心弦。
世间佳丽何其多,独爱罗敷情未央。
春风十里不如你,芳华绝代永难忘。
总结
《陌上桑》
通过对 罗敷
的外貌、气质和社会影响的描写,展现了汉代人们对美女的审美标准。不仅注重外貌的美丽,还强调内在的美德和气质,以及对周围人的吸引力。这种综合的审美观念在当时的社会中具有重要的地位。