CSharp: Strategy Pattern in donet core 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /// <summary> /// 车辆行为模型 /// Abstract Behavior /// 策略模式 Strategy Pattern /// geovindu, Geovin Du edit /// /// </summary> public abstract class VehicleBehavior { /// <summary> /// 关于我 /// </summary> /// <param name="vehicle">输入车名称</param> public abstract void AboutMe( string vehicle); } /// <summary> /// Floating capability /// 移动的能力 /// </summary> class FloatBehavior : VehicleBehavior { /// <summary> /// 关于我 /// </summary> /// <param name="vehicle">输入车名称</param> public override void AboutMe( string vehicle) { Console.WriteLine($ "我的 {vehicle} 现在能移动." ); } } /// <summary> /// Flying capability /// 飞行能力 /// </summary> class FlyBehavior : VehicleBehavior { /// <summary> /// 关于我 /// </summary> /// <param name="vehicle">输入车名称</param> public override void AboutMe( string vehicle) { Console.WriteLine($ "我的 {vehicle} 现在能飞." ); } } /// <summary> /// Initial behavior.Cannot do anything special. /// </summary> class InitialBehavior : VehicleBehavior { /// <summary> /// 关于我 /// </summary> /// <param name="vehicle">输入车名称</param> public override void AboutMe( string vehicle) { Console.WriteLine($ "我的 {vehicle} 刚产生.它不能做特别的事情." ); } } /// <summary> /// Context class-Vehicle /// 车对象类 /// </summary> public class Vehicle { /// <summary> /// /// </summary> VehicleBehavior behavior; /// <summary> /// 类型 /// </summary> string vehicleType; /// <summary> /// 构造对象 /// </summary> /// <param name="vehicleType">输入类型</param> public Vehicle( string vehicleType) { this .vehicleType = vehicleType; //Setting the initial behavior this .behavior = new InitialBehavior(); } /* * It's your choice. You may prefer to use a setter * method instead of using a constructor. * You can call this method whenever we want * to change the "vehicle behavior" on the fly. */ /// <summary> /// 设置 /// </summary> /// <param name="behavior"></param> public void SetVehicleBehavior(VehicleBehavior behavior) { this .behavior = behavior; } /* This method will help us to delegate the behavior to the object referenced by vehicle.You do not know about the object type, but you simply know that this object can tell something about it, i.e. "AboutMe()" method */ /// <summary> /// 显示 /// </summary> public void DisplayAboutMe() { behavior.AboutMe(vehicleType); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | /// <summary> /// 策略模式 Strategy Pattern /// geovindu, Geovin Du edit /// </summary> public enum OutputFormat { Markdown, Html } /// <summary> /// /// </summary> public interface IListStrategy { /// <summary> /// /// </summary> /// <param name="sb"></param> void Start(StringBuilder sb); /// <summary> /// /// </summary> /// <param name="sb"></param> void End(StringBuilder sb); /// <summary> /// /// </summary> /// <param name="sb"></param> /// <param name="item"></param> void AddListItem(StringBuilder sb, string item); } /// <summary> /// /// </summary> public class MarkdownListStrategy : IListStrategy { /// <summary> /// /// </summary> /// <param name="sb"></param> public void Start(StringBuilder sb) { // markdown doesn't require a list preamble } /// <summary> /// /// </summary> /// <param name="sb"></param> public void End(StringBuilder sb) { } /// <summary> /// /// </summary> /// <param name="sb"></param> /// <param name="item"></param> public void AddListItem(StringBuilder sb, string item) { sb.AppendLine($ " * {item}" ); } } /// <summary> /// /// </summary> public class HtmlListStrategy : IListStrategy { /// <summary> /// /// </summary> /// <param name="sb"></param> public void Start(StringBuilder sb) => sb.AppendLine( "<ul>" ); /// <summary> /// /// </summary> /// <param name="sb"></param> public void End(StringBuilder sb) => sb.AppendLine( "</ul>" ); /// <summary> /// /// </summary> /// <param name="sb"></param> /// <param name="item"></param> public void AddListItem(StringBuilder sb, string item) { sb.AppendLine($ " <li>{item}</li>" ); } } /// <summary> /// /// </summary> public class TextProcessor { /// <summary> /// /// </summary> private StringBuilder sb = new StringBuilder(); /// <summary> /// /// </summary> private IListStrategy listStrategy; /// <summary> /// /// </summary> /// <param name="format"></param> /// <exception cref="ArgumentOutOfRangeException"></exception> public void SetOutputFormat(OutputFormat format) { switch (format) { case OutputFormat.Markdown: listStrategy = new MarkdownListStrategy(); break ; case OutputFormat.Html: listStrategy = new HtmlListStrategy(); break ; default : throw new ArgumentOutOfRangeException(nameof(format), format, null ); } } /// <summary> /// /// </summary> /// <param name="items"></param> public void AppendList(IEnumerable< string > items) { listStrategy.Start(sb); foreach ( var item in items) listStrategy.AddListItem(sb, item); listStrategy.End(sb); } /// <summary> /// /// </summary> /// <returns></returns> public StringBuilder Clear() { return sb.Clear(); } /// <summary> /// /// </summary> /// <returns></returns> public override string ToString() => sb.ToString(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | /// <summary> /// 策略模式 Strategy Pattern /// geovindu, Geovin Du edit /// </summary> class Person : IEquatable<Person>, IComparable<Person> { /// <summary> /// /// </summary> public int Id; /// <summary> /// /// </summary> public string Name; /// <summary> /// /// </summary> public int Age; /// <summary> /// /// </summary> /// <param name="other"></param> /// <returns></returns> public int CompareTo(Person other) { if (ReferenceEquals( this , other)) return 0; if (ReferenceEquals( null , other)) return 1; return Id.CompareTo(other.Id); } /// <summary> /// /// </summary> /// <param name="id"></param> /// <param name="name"></param> /// <param name="age"></param> public Person( int id, string name, int age) { Id = id; Name = name; Age = age; } /// <summary> /// /// </summary> /// <param name="other"></param> /// <returns></returns> public bool Equals(Person other) { if (ReferenceEquals( null , other)) return false ; if (ReferenceEquals( this , other)) return true ; return Id == other.Id; } /// <summary> /// /// </summary> /// <param name="obj"></param> /// <returns></returns> public override bool Equals( object obj) { if (ReferenceEquals( null , obj)) return false ; if (ReferenceEquals( this , obj)) return true ; if (obj.GetType() != this .GetType()) return false ; return Equals((Person)obj); } /// <summary> /// /// </summary> /// <returns></returns> public override int GetHashCode() { return Id; } /// <summary> /// /// </summary> /// <returns></returns> public override string ToString() { return $ "序号({nameof(Id)}):{Id};姓名({nameof(Name)}):{Name};年岁({nameof(Age)}):{Age}" ; } /// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> public static bool operator ==(Person left, Person right) { return Equals(left, right); } /// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <returns></returns> public static bool operator !=(Person left, Person right) { return !Equals(left, right); } /// <summary> /// /// </summary> private sealed class NameRelationalComparer : IComparer<Person> { /// <summary> /// /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Compare(Person x, Person y) { if (ReferenceEquals(x, y)) return 0; if (ReferenceEquals( null , y)) return 1; if (ReferenceEquals( null , x)) return -1; return string .Compare(x.Name, y.Name, StringComparison.Ordinal); } } /// <summary> /// 名字排序 /// </summary> public static IComparer<Person> NameComparer { get ; } = new NameRelationalComparer(); } |
调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | //策略模式 Console.WriteLine( "***策略模式 Strategy Pattern Demo.***\n" ); Vehicle context = new Vehicle( "Aeroplane(飞机)" ); context.DisplayAboutMe(); Console.WriteLine( "Setting flying capability(设置飞行能力) to vehicle." ); context.SetVehicleBehavior( new FlyBehavior()); context.DisplayAboutMe(); Console.WriteLine( "Changing the vehicle behavior(改为移动能力) again." ); context.SetVehicleBehavior( new FloatBehavior()); context.DisplayAboutMe(); // var tp = new TextProcessor(); tp.SetOutputFormat(OutputFormat.Markdown); tp.AppendList( new [] { "foo" , "bar" , "baz" }); Console.WriteLine(tp); tp.Clear(); tp.SetOutputFormat(OutputFormat.Html); tp.AppendList( new [] { "foo" , "bar" , "baz" }); Console.WriteLine(tp); // var people = new List<Person>(); // equality == != and comparison < = > people.Add( new Person(1, "geovindu" , 25)); people.Add( new Person(2, "涂聚文" , 28)); people.Add( new Person(3, "江山" , 38)); people.Add( new Person(4, "李玉" , 18)); people.Add( new Person(5, "张清" , 20)); people.Sort(); // meaningless by default foreach (Person p in people) { Console.WriteLine( "第1次ID排序:" + p.ToString()); } Console.WriteLine( "***.***\n" ); // sort by name with a lambda //名字排序 people.Sort((x, y) => x.Name.CompareTo(y.Name)); foreach (Person p in people) { Console.WriteLine( "第2次名字排序:" + p.ToString()); } Console.WriteLine( "***.***\n" ); // people.Sort(Person.NameComparer); foreach (Person p in people) { Console.WriteLine( "第3次名字排序" +p.ToString()); } Console.WriteLine( "***.***\n" ); people.Sort((x, y) => x.Age.CompareTo(y.Age)); foreach (Person p in people) { Console.WriteLine( "第4次年龄排序" + p.ToString()); } Console.ReadKey(); } |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | ***策略模式 Strategy Pattern Demo.*** 我的 Aeroplane(飞机) 刚产生.它不能做特别的事情. Setting flying capability(设置飞行能力) to vehicle. 我的 Aeroplane(飞机) 现在能飞. Changing the vehicle behavior(改为移动能力) again. 我的 Aeroplane(飞机) 现在能移动. * foo * bar * baz <ul> <li>foo</li> <li>bar</li> <li>baz</li> </ul> 第1次ID排序:序号(Id):1;姓名(Name):geovindu;年岁(Age):25 第1次ID排序:序号(Id):2;姓名(Name):涂聚文;年岁(Age):28 第1次ID排序:序号(Id):3;姓名(Name):江山;年岁(Age):38 第1次ID排序:序号(Id):4;姓名(Name):李玉;年岁(Age):18 第1次ID排序:序号(Id):5;姓名(Name):张清;年岁(Age):20 ***.*** 第2次名字排序:序号(Id):1;姓名(Name):geovindu;年岁(Age):25 第2次名字排序:序号(Id):3;姓名(Name):江山;年岁(Age):38 第2次名字排序:序号(Id):4;姓名(Name):李玉;年岁(Age):18 第2次名字排序:序号(Id):2;姓名(Name):涂聚文;年岁(Age):28 第2次名字排序:序号(Id):5;姓名(Name):张清;年岁(Age):20 ***.*** 第3次名字排序序号(Id):1;姓名(Name):geovindu;年岁(Age):25 第3次名字排序序号(Id):5;姓名(Name):张清;年岁(Age):20 第3次名字排序序号(Id):4;姓名(Name):李玉;年岁(Age):18 第3次名字排序序号(Id):3;姓名(Name):江山;年岁(Age):38 第3次名字排序序号(Id):2;姓名(Name):涂聚文;年岁(Age):28 ***.*** 第4次年龄排序序号(Id):4;姓名(Name):李玉;年岁(Age):18 第4次年龄排序序号(Id):5;姓名(Name):张清;年岁(Age):20 第4次年龄排序序号(Id):1;姓名(Name):geovindu;年岁(Age):25 第4次年龄排序序号(Id):2;姓名(Name):涂聚文;年岁(Age):28 第4次年龄排序序号(Id):3;姓名(Name):江山;年岁(Age):38 |
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
分类:
CSharp code
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!