【自学】大话设计模式控制台
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System; 2 using System.CodeDom; 3 using System.Collections; 4 using System.Collections.Generic; 5 using System.Data.SqlClient; 6 using System.Linq; 7 using System.Runtime.Remoting; 8 using System.Runtime.Remoting.Contexts; 9 using System.Security.Policy; 10 using System.Text; 11 using System.Threading.Tasks; 12 13 namespace dhsjmsStudy 14 { 15 #region 简单工厂模式 16 public class operation 17 { 18 public decimal numberA { get; set; } 19 public decimal numberB { get; set; } 20 21 public virtual decimal GetResult() 22 { 23 return 0; 24 } 25 } 26 27 28 public class Add : operation 29 { 30 public override decimal GetResult() 31 { 32 return numberA + numberB; 33 } 34 } 35 36 public class Sub : operation 37 { 38 public override decimal GetResult() 39 { 40 return numberA - numberB; 41 } 42 } 43 44 public class Mlu : operation 45 { 46 public override decimal GetResult() 47 { 48 return numberA / numberB; 49 } 50 } 51 52 public class Div : operation 53 { 54 public override decimal GetResult() 55 { 56 return numberA * numberB; 57 } 58 } 59 #endregion 60 61 #region 策略模式 62 /// <summary> 63 /// 抽象收银类 64 /// </summary> 65 public abstract class CashSuper 66 { 67 public abstract double acceptCash(double money); 68 } 69 /// <summary> 70 /// 原价 71 /// </summary> 72 public class CashNormal : CashSuper 73 { 74 public override double acceptCash(double money) 75 { 76 return money; 77 } 78 } 79 80 /// <summary> 81 /// 打折 82 /// </summary> 83 public class CashRebate : CashSuper 84 { 85 private double moneyRebate = 1d; 86 87 public CashRebate(string moneyRebate) 88 { 89 this.moneyRebate = double.Parse(moneyRebate); 90 } 91 92 public override double acceptCash(double money) 93 { 94 return money * moneyRebate; 95 } 96 } 97 98 /// <summary> 99 /// 返利 100 /// </summary> 101 public class CashReturn : CashSuper 102 { 103 private double moneyCondition = 0; 104 private double moneyReturn = 0; 105 106 public CashReturn(string moneyCondition, string moneyReturn) 107 { 108 this.moneyCondition = double.Parse(moneyCondition); 109 this.moneyReturn = double.Parse(moneyReturn); 110 } 111 112 public override double acceptCash(double money) 113 { 114 return money >= moneyCondition ? (money - Math.Floor(money / moneyCondition) * moneyReturn) : money; 115 } 116 } 117 118 119 /// <summary> 120 /// 策略模式(策略封装了变化) 121 /// </summary> 122 public class CashContext 123 { 124 private CashSuper cs; 125 public CashContext(CashSuper csuper) 126 { 127 cs = csuper; 128 } 129 130 public CashContext(string type) 131 { 132 switch (type) 133 { 134 case "正常消费": 135 cs = new CashNormal(); 136 break; 137 case "满300返100": 138 cs = new CashReturn("300", "100"); 139 break; 140 case "打八折": 141 cs = new CashRebate("0.8"); 142 break; 143 } 144 } 145 146 public double GetResult(double money) 147 { 148 return cs.acceptCash(money); 149 } 150 } 151 152 #endregion 153 154 #region 装饰模式 155 156 public class Person 157 { 158 public string name { get; set; } 159 160 public Person() 161 { 162 163 } 164 165 public Person(string name) 166 { 167 this.name = name; 168 } 169 170 public virtual void Show() 171 { 172 Console.WriteLine("装扮的{0}", name); 173 } 174 } 175 176 /// <summary> 177 /// 服饰抽象类 178 /// </summary> 179 internal class Finery : Person 180 { 181 protected Person component; 182 183 184 public override void Show() 185 { 186 if (component != null) 187 component.Show(); 188 } 189 190 public void Decorate(Person component) 191 { 192 this.component = component; 193 } 194 195 } 196 197 internal class Tshirts : Finery 198 { 199 public override void Show() 200 { 201 Console.WriteLine("大T桖"); 202 base.Show(); 203 } 204 } 205 206 internal class BigTrouser : Finery 207 { 208 public override void Show() 209 { 210 Console.WriteLine("垮裤"); 211 base.Show(); 212 } 213 } 214 //其余... 215 #endregion 216 217 #region 代理模式 218 219 interface I代理 220 { 221 void SH(); 222 void WatchTv(); 223 } 224 225 public class ZQ : I代理 226 { 227 private BZQ person; 228 229 public ZQ(BZQ person) 230 { 231 this.person = person; 232 } 233 234 public void SH() 235 { 236 Console.WriteLine(person.Name + "送花"); 237 } 238 239 public void WatchTv() 240 { 241 Console.WriteLine(person.Name + "看电视"); 242 } 243 } 244 245 public class 代理人 : I代理 246 { 247 private ZQ gg; 248 249 public 代理人(BZQ mm) 250 { 251 gg = new ZQ(mm); 252 } 253 254 public void SH() 255 { 256 gg.SH(); 257 } 258 259 public void WatchTv() 260 { 261 gg.WatchTv(); 262 } 263 } 264 265 266 public class BZQ 267 { 268 public string Name { get; set; } 269 } 270 271 #endregion 272 273 #region 工厂方法模式 274 275 internal interface I工厂 276 { 277 operation CreateOperation(); 278 } 279 280 class AddFactory : I工厂 281 { 282 public operation CreateOperation() 283 { 284 return new Add(); 285 } 286 } 287 288 class SubFactory : I工厂 289 { 290 public operation CreateOperation() 291 { 292 return new Sub(); 293 } 294 } 295 296 class MulFactory : I工厂 297 { 298 public operation CreateOperation() 299 { 300 return new Mlu(); 301 } 302 } 303 304 class DivFactory : I工厂 305 { 306 public operation CreateOperation() 307 { 308 return new Div(); 309 } 310 } 311 312 /// <summary> 313 /// 雷锋 314 /// </summary> 315 316 internal class LeiFeng 317 { 318 public void Sweep() 319 { 320 Console.WriteLine("扫地"); 321 } 322 323 public void Wash() 324 { 325 Console.WriteLine("洗衣"); 326 } 327 328 public void BuyRice() 329 { 330 Console.WriteLine("买米"); 331 } 332 } 333 334 //学雷锋 335 internal class StudyPerson : LeiFeng 336 { 337 338 } 339 340 class Volunteer : LeiFeng 341 { 342 343 } 344 //简单雷锋工厂 345 internal class SimpleFactory 346 { 347 public static LeiFeng CreateLeiFeng(string type) 348 { 349 LeiFeng leiFeng = null; 350 switch (type) 351 { 352 case "大学生": 353 leiFeng = new StudyPerson(); 354 break; 355 case "社区志愿者": 356 leiFeng = new Volunteer(); 357 break; 358 } 359 return leiFeng; 360 } 361 } 362 363 interface IFactory 364 { 365 LeiFeng CreateLeiFeng(); 366 } 367 368 /// <summary> 369 /// 学雷锋的大学生工厂 370 /// </summary> 371 internal class UndergraduateFactory : IFactory 372 { 373 public LeiFeng CreateLeiFeng() 374 { 375 return new StudyPerson(); 376 } 377 } 378 379 internal class VolunteerFactory : IFactory 380 { 381 public LeiFeng CreateLeiFeng() 382 { 383 return new Volunteer(); 384 } 385 } 386 387 #endregion 388 389 #region 原型模式 390 /// <summary> 391 /// 原型类 392 /// </summary> 393 internal abstract class Prototype 394 { 395 private string id; 396 public string Id 397 { 398 get { return id; } 399 } 400 401 public Prototype(string id) 402 { 403 this.id = id; 404 } 405 406 public abstract Prototype Clone(); 407 } 408 409 /// <summary> 410 /// 具体原型类 411 /// </summary> 412 internal class ConcretePrototype : Prototype 413 { 414 public ConcretePrototype(string id) 415 : base(id) 416 { 417 418 } 419 420 public override Prototype Clone() 421 { 422 return (Prototype)this.MemberwiseClone(); 423 } 424 } 425 426 /// <summary> 427 /// 工作经历类 428 /// </summary> 429 internal class WorkExperience : ICloneable 430 { 431 public string wordDate { get; set; } 432 433 public string Company { get; set; } 434 435 public Object Clone() 436 { 437 return (Object)this.MemberwiseClone(); 438 } 439 } 440 /// <summary> 441 /// 简历类 442 /// </summary> 443 internal class Resume : ICloneable 444 { 445 private string name; 446 private string sex; 447 private string age; 448 //工作经历对象 449 private WorkExperience work; 450 451 public Resume(string name) 452 { 453 this.name = name; 454 work = new WorkExperience(); 455 } 456 457 private Resume(WorkExperience work) 458 { 459 this.work = (WorkExperience)work.Clone(); 460 } 461 462 //设置个人信息 463 public void SetPersonalInfo(string sex, string age) 464 { 465 this.sex = sex; 466 this.age = age; 467 } 468 469 //设置工作经历 470 public void SetWorkExperience(string wordDate, string company) 471 { 472 work.wordDate = wordDate; 473 work.Company = company; 474 } 475 476 //显示 477 public void Display() 478 { 479 Console.WriteLine("{0},{1},{2}", name, sex, age); 480 Console.WriteLine("工作经历:{0},{1}", work.wordDate, work.Company); 481 } 482 483 public Object Clone() 484 { 485 Resume obj = new Resume(this.work); 486 obj.name = this.name; 487 obj.sex = this.sex; 488 obj.age = this.age; 489 return obj; 490 } 491 } 492 493 #endregion 494 495 #region 模板方法模式 496 497 internal class TestPaper 498 { 499 public void TestQuestion1() 500 { 501 Console.WriteLine("第一题:a b c d "); 502 Console.WriteLine(Answer1()); 503 } 504 505 public void TestQuestion2() 506 { 507 Console.WriteLine("第二题:a b c d "); 508 Console.WriteLine(Answer2()); 509 } 510 511 public void TestQuestion3() 512 { 513 Console.WriteLine("第三题:a b c d "); 514 Console.WriteLine(Answer3()); 515 } 516 517 protected virtual string Answer1() 518 { 519 return ""; 520 } 521 protected virtual string Answer2() 522 { 523 return ""; 524 } 525 protected virtual string Answer3() 526 { 527 return ""; 528 } 529 } 530 531 internal class TestPaperA : TestPaper 532 { 533 protected override string Answer1() 534 { 535 return "a"; 536 } 537 protected override string Answer2() 538 { 539 return "b"; 540 } 541 protected override string Answer3() 542 { 543 return "c"; 544 } 545 546 } 547 548 549 internal class TestPaperB : TestPaper 550 { 551 protected override string Answer1() 552 { 553 return "c"; 554 } 555 protected override string Answer2() 556 { 557 return "b"; 558 } 559 protected override string Answer3() 560 { 561 return "a"; 562 } 563 } 564 565 #endregion 566 567 #region 外观模式 568 /// <summary> 569 /// 股票1 570 /// </summary> 571 internal class Stock1 572 { 573 public void Sell() 574 { 575 Console.WriteLine("1卖出"); 576 } 577 578 public void Buy() 579 { 580 Console.WriteLine("1买入"); 581 } 582 } 583 584 /// <summary> 585 /// 股票2 586 /// </summary> 587 internal class Stock2 588 { 589 public void Sell() 590 { 591 Console.WriteLine("2卖出"); 592 } 593 594 public void Buy() 595 { 596 Console.WriteLine("2买入"); 597 } 598 } 599 600 /// <summary> 601 /// 投资基金类 602 /// </summary> 603 internal class Fund 604 { 605 private Stock1 gu1; 606 private Stock2 gu2; 607 608 public Fund() 609 { 610 gu1 = new Stock1(); 611 gu2 = new Stock2(); 612 } 613 614 615 public void BuyFund() 616 { 617 gu1.Buy(); 618 gu2.Buy(); 619 } 620 621 public void SellFund() 622 { 623 gu1.Sell(); 624 gu2.Sell(); 625 } 626 627 628 } 629 630 #endregion 631 632 #region 建造者模式 633 634 public class Product 635 { 636 IList<string> parts = new List<string>(); 637 638 /// <summary> 639 /// 添加产品部件 640 /// </summary> 641 /// <param name="part"></param> 642 public void Add(string part) 643 { 644 parts.Add(part); 645 } 646 647 /// <summary> 648 /// 列举所有的产品部件 649 /// </summary> 650 public void Show() 651 { 652 Console.WriteLine("产品 创建 ----"); 653 foreach (var part in parts) 654 { 655 Console.WriteLine(part); 656 } 657 } 658 } 659 660 /// <summary> 661 /// 抽象建造者类 662 /// </summary> 663 public abstract class Builder 664 { 665 public abstract void BuildePartA(); 666 667 public abstract void BuildePartB(); 668 669 public abstract Product GetResult(); 670 } 671 672 public class ConcreteBuilder1 : Builder 673 { 674 private Product product = new Product(); 675 676 public override void BuildePartA() 677 { 678 product.Add("部件a"); 679 } 680 681 public override void BuildePartB() 682 { 683 product.Add("部件b"); 684 } 685 686 public override Product GetResult() 687 { 688 return product; 689 } 690 } 691 692 public class ConcreteBuilder2 : Builder 693 { 694 private Product product = new Product(); 695 696 public override void BuildePartA() 697 { 698 product.Add("部件XX"); 699 } 700 701 public override void BuildePartB() 702 { 703 product.Add("部件YY"); 704 } 705 706 public override Product GetResult() 707 { 708 return product; 709 } 710 } 711 712 internal class Director 713 { 714 public void Construct(Builder builder) 715 { 716 builder.BuildePartA(); 717 builder.BuildePartB(); 718 } 719 } 720 721 #endregion 722 723 #region 观察者模式 724 725 #region 最终版 726 727 public delegate void EventHandler(); 728 /// <summary> 729 /// 通知者接口 730 /// </summary> 731 public interface ISubject 732 { 733 void Attach(Observer observer); 734 735 void Detach(Observer observer); 736 737 void Notify(); 738 739 string SubjectState { get; set; } 740 } 741 742 public class Boss : ISubject 743 { 744 private IList<Observer> observers = new List<Observer>(); 745 private string action; 746 747 public event EventHandler Update; 748 //老板状态 749 public string SubAction 750 { 751 get { return action; } 752 set { action = value; } 753 } 754 /// <summary> 755 /// 添加要帮忙的同事 756 /// </summary> 757 /// <param name="observer"></param> 758 public void Attach(Observer observer) 759 { 760 observers.Add(observer); 761 } 762 763 public void Detach(Observer observer) 764 { 765 observers.Remove(observer); 766 } 767 768 public void Notify1() 769 { 770 Update(); 771 } 772 //通知 773 public void Notify() 774 { 775 foreach (Observer o in observers) 776 { 777 o.Update(); 778 } 779 } 780 public string SubjectState { get; set; } 781 } 782 public abstract class Observer 783 { 784 protected string name; 785 protected ISubject sub; 786 787 public Observer(string name, ISubject sub) 788 { 789 this.name = name; 790 this.sub = sub; 791 } 792 793 public abstract void Update(); 794 } 795 796 /// <summary> 797 /// 看股票的 798 /// </summary> 799 public class StockObserver : Observer 800 { 801 public StockObserver(string name, ISubject sub) 802 : base(name, sub) 803 { 804 } 805 806 public override void Update() 807 { 808 Console.WriteLine("{0} {1} 关闭股票咯,继续工作。", sub.SubjectState, name); 809 } 810 811 //事件委托实现 812 public void CloseStockMarket() 813 { 814 Console.WriteLine("{0} {1} 关闭股票咯,继续工作。委托", sub.SubjectState, name); 815 } 816 } 817 818 819 /// <summary> 820 /// 看NBA的 821 /// </summary> 822 public class NBAObserver : Observer 823 { 824 public NBAObserver(string name, ISubject sub) 825 : base(name, sub) 826 { 827 } 828 829 public override void Update() 830 { 831 Console.WriteLine("{0} {1} 关闭NBA咯,继续工作。", sub.SubjectState, name); 832 } 833 834 835 //事件委托实现 836 public void CloseNBA() 837 { 838 Console.WriteLine("{0} {1} 关闭NBA咯,继续工作。委托", sub.SubjectState, name); 839 } 840 } 841 #endregion 842 843 844 845 public class Secretary 846 { 847 private IList<StockObserver> observers = new List<StockObserver>(); 848 private string action; 849 850 /// <summary> 851 /// 添加要帮忙的同事 852 /// </summary> 853 /// <param name="observer"></param> 854 public void Attach(StockObserver observer) 855 { 856 observers.Add(observer); 857 } 858 859 public void Detach(StockObserver observer) 860 { 861 observers.Remove(observer); 862 } 863 864 865 //通知 866 public void Notify() 867 { 868 foreach (StockObserver o in observers) 869 { 870 o.Update(); 871 } 872 } 873 874 //前台状态 875 public string SecretaryAction 876 { 877 get { return action; } 878 set { action = value; } 879 } 880 } 881 882 #endregion 883 884 #region 抽象工厂模式 885 886 public class User 887 { 888 public int id { get; set; } 889 890 public string name { get; set; } 891 892 } 893 894 public interface IUser 895 { 896 void Insert(User user); 897 898 User GetUser(int id); 899 } 900 901 public class SqlserverUser : IUser 902 { 903 public void Insert(User user) 904 { 905 Console.WriteLine("Sqlserver添加一条消息"); 906 } 907 908 public User GetUser(int id) 909 { 910 Console.WriteLine("Sqlserver查询一条消息"); 911 return null; 912 } 913 } 914 915 public class AccessUser : IUser 916 { 917 public void Insert(User user) 918 { 919 Console.WriteLine("Access添加一条消息"); 920 } 921 922 public User GetUser(int id) 923 { 924 Console.WriteLine("Access查询一条消息"); 925 return null; 926 } 927 } 928 929 public interface IFactoryDB 930 { 931 IUser CreateUser(); 932 } 933 934 public class SqlServerFactory : IFactoryDB 935 { 936 public IUser CreateUser() 937 { 938 return new SqlserverUser(); 939 } 940 } 941 942 public class AccessFactory : IFactoryDB 943 { 944 public IUser CreateUser() 945 { 946 return new AccessUser(); 947 } 948 } 949 950 //用简单工厂改进抽象工厂 951 //public class DataAccess 952 //{ 953 // private static readonly string db = "Sqlserver"; 954 // //private static readonly string db = "Access"; 955 956 // public static Iuser 957 //} 958 959 #endregion 960 961 #region 状态模式 962 963 public abstract class State 964 { 965 public abstract void Handle(Context context); 966 } 967 968 public class ConcreteStateA : State 969 { 970 public override void Handle(Context context) 971 { 972 context.State = new ConcreteStateB(); 973 } 974 } 975 976 public class ConcreteStateB : State 977 { 978 public override void Handle(Context context) 979 { 980 context.State = new ConcreteStateA(); 981 } 982 } 983 984 public class Context 985 { 986 private State state; 987 988 public Context(State state) 989 { 990 this.state = state; 991 } 992 993 public State State 994 { 995 get { return state; } 996 set 997 { 998 state = value; 999 Console.WriteLine("当前状态:" + state.GetType().Name); 1000 } 1001 } 1002 1003 public void Request() 1004 { 1005 state.Handle(this); 1006 } 1007 } 1008 1009 #endregion 1010 1011 #region 适配器模式 1012 1013 public class Target 1014 { 1015 public virtual void Request() 1016 { 1017 Console.WriteLine("普通请求!"); 1018 } 1019 } 1020 1021 public class Adaptee 1022 { 1023 public void SpecificRequest() 1024 { 1025 Console.WriteLine("特殊请求!"); 1026 } 1027 } 1028 1029 public class Adapter : Target 1030 { 1031 private Adaptee adaptee = new Adaptee(); 1032 1033 public override void Request() 1034 { 1035 adaptee.SpecificRequest(); 1036 } 1037 } 1038 1039 #endregion 1040 1041 #region 备忘录模式 1042 /// <summary> 1043 /// 发起人 1044 /// </summary> 1045 public class Originator 1046 { 1047 public string state { get; set; } 1048 1049 public Memento CreateMemento() 1050 { 1051 return new Memento(state); 1052 } 1053 1054 public void SetMemento(Memento memento) 1055 { 1056 state = memento.State; 1057 } 1058 1059 public void Show() 1060 { 1061 Console.WriteLine("State=" + state); 1062 } 1063 } 1064 1065 /// <summary> 1066 /// 备忘类 1067 /// </summary> 1068 public class Memento 1069 { 1070 private string state; 1071 1072 public Memento(string state) 1073 { 1074 this.state = state; 1075 } 1076 1077 public string State 1078 { 1079 get { return state; } 1080 } 1081 } 1082 /// <summary> 1083 /// 管理者 1084 /// </summary> 1085 public class Caretaker 1086 { 1087 public Memento memento { get; set; } 1088 } 1089 1090 #endregion 1091 1092 #region 组合模式 1093 1094 public abstract class Component 1095 { 1096 protected string name; 1097 1098 public Component(string name) 1099 { 1100 this.name = name; 1101 } 1102 1103 public abstract void Add(Component c); 1104 public abstract void Remove(Component c); 1105 public abstract void Display(int depth); 1106 1107 } 1108 1109 public class Leaf : Component 1110 { 1111 public Leaf(string name) 1112 : base(name) 1113 { 1114 } 1115 1116 public override void Add(Component c) 1117 { 1118 Console.WriteLine("添加"); 1119 } 1120 1121 public override void Remove(Component c) 1122 { 1123 Console.WriteLine("删除"); 1124 } 1125 1126 public override void Display(int depth) 1127 { 1128 Console.WriteLine(new string('-', depth) + name); 1129 } 1130 } 1131 1132 public class Composite : Component 1133 { 1134 private List<Component> children = new List<Component>(); 1135 public Composite(string name) 1136 : base(name) 1137 { 1138 } 1139 1140 public override void Add(Component c) 1141 { 1142 children.Add(c); 1143 } 1144 1145 public override void Remove(Component c) 1146 { 1147 children.Remove(c); 1148 } 1149 1150 public override void Display(int depth) 1151 { 1152 Console.WriteLine(new string('-', depth) + name); 1153 1154 foreach (Component component in children) 1155 { 1156 component.Display(depth + 2); 1157 } 1158 } 1159 } 1160 1161 #endregion 1162 1163 #region 迭代器模式 1164 1165 /// <summary> 1166 /// Iterator迭代器抽象类 1167 /// </summary> 1168 public abstract class Iterator 1169 { 1170 public abstract object First(); 1171 1172 public abstract object Next(); 1173 1174 public abstract bool IsDone(); 1175 public abstract object CurrentItem(); 1176 } 1177 1178 /// <summary> 1179 /// 聚集抽象类 1180 /// </summary> 1181 public abstract class Aggregate 1182 { 1183 public abstract Iterator CreateIterator(); 1184 } 1185 1186 1187 public class ConcreteIterator : Iterator 1188 { 1189 private ConcreteAggregate aggregate; 1190 private int current = 0; 1191 1192 public ConcreteIterator(ConcreteAggregate aggregate) 1193 { 1194 this.aggregate = aggregate; 1195 } 1196 1197 public override object First() 1198 { 1199 return aggregate[0]; 1200 } 1201 1202 public override object Next() 1203 { 1204 object ret = null; 1205 current++; 1206 if (current < aggregate.Count) 1207 ret = aggregate[current]; 1208 return ret; 1209 } 1210 1211 public override bool IsDone() 1212 { 1213 return current >= aggregate.Count; 1214 } 1215 1216 public override object CurrentItem() 1217 { 1218 return aggregate[current]; 1219 } 1220 } 1221 1222 1223 public class ConcreteAggregate : Aggregate 1224 { 1225 private IList<object> items = new List<object>(); 1226 public override Iterator CreateIterator() 1227 { 1228 return new ConcreteIterator(this); 1229 } 1230 1231 public int Count 1232 { 1233 get { return items.Count; } 1234 } 1235 1236 public object this[int index] 1237 { 1238 get { return items[index]; } 1239 set { items.Insert(index, value); } 1240 } 1241 } 1242 1243 #endregion 1244 1245 #region 单例模式 1246 1247 public class Singleton 1248 { 1249 public static Singleton instance; 1250 1251 private static readonly object syncRoot = new object(); 1252 private Singleton() 1253 { 1254 1255 } 1256 1257 public static Singleton GetInstance() 1258 { 1259 //双重锁定 1260 if (instance == null) 1261 { 1262 lock (syncRoot) 1263 { 1264 if (instance == null) 1265 { 1266 instance = new Singleton(); 1267 } 1268 } 1269 } 1270 return instance; 1271 } 1272 } 1273 1274 #endregion 1275 1276 #region 桥接模式 1277 1278 //public partial class HandsetGame 1279 //{ 1280 // public virtual void Run() 1281 // { 1282 1283 // } 1284 //} 1285 1286 //public class HandsetMGame : HandsetGame 1287 //{ 1288 // public override void Run() 1289 // { 1290 // Console.WriteLine("运行M"); 1291 // } 1292 //} 1293 1294 //public class HandsetNGame : HandsetGame 1295 //{ 1296 // public override void Run() 1297 // { 1298 // Console.WriteLine("运行N"); 1299 // } 1300 //} 1301 1302 1303 #region 松耦合的程序 1304 /// <summary> 1305 /// 手机软件 1306 /// </summary> 1307 public abstract class HandsetSoft 1308 { 1309 public abstract void Run(); 1310 } 1311 /// <summary> 1312 /// 手机游戏 1313 /// </summary> 1314 public class HandsetGame : HandsetSoft 1315 { 1316 public override void Run() 1317 { 1318 Console.WriteLine("运行手机游戏"); 1319 } 1320 } 1321 /// <summary> 1322 /// 手机通讯录 1323 /// </summary> 1324 public class HandsetAddressList : HandsetSoft 1325 { 1326 public override void Run() 1327 { 1328 Console.WriteLine("运行手机通讯录"); 1329 } 1330 } 1331 1332 /// <summary> 1333 /// 手机品牌类 1334 /// </summary> 1335 public abstract class HandsetBrand 1336 { 1337 protected HandsetSoft soft; 1338 1339 public void SetHandsetSoft(HandsetSoft soft) 1340 { 1341 this.soft = soft; 1342 } 1343 1344 public abstract void Run(); 1345 } 1346 1347 public class HandsetBrandM : HandsetBrand 1348 { 1349 public override void Run() 1350 { 1351 soft.Run(); 1352 } 1353 } 1354 public class HandsetBrandN : HandsetBrand 1355 { 1356 public override void Run() 1357 { 1358 soft.Run(); 1359 } 1360 } 1361 #endregion 1362 #endregion 1363 1364 #region 命令模式 1365 /// <summary> 1366 /// 抽象命令 1367 /// </summary> 1368 public abstract class Command 1369 { 1370 protected Barbecuer receiver; 1371 1372 public Command(Barbecuer receiver) 1373 { 1374 this.receiver = receiver; 1375 } 1376 1377 public abstract void ExcuteCommand(); 1378 } 1379 1380 1381 public class Barbecuer 1382 { 1383 public void BakeMutton() 1384 { 1385 Console.WriteLine("烤肉"); 1386 } 1387 1388 public void BakeChickenWing() 1389 { 1390 Console.WriteLine("鸡翅"); 1391 } 1392 } 1393 1394 /// <summary> 1395 /// 烤肉 1396 /// </summary> 1397 public class BakeMuttonCommand : Command 1398 { 1399 public BakeMuttonCommand(Barbecuer receiver) 1400 : base(receiver) 1401 { 1402 } 1403 1404 public override void ExcuteCommand() 1405 { 1406 receiver.BakeMutton(); 1407 } 1408 } 1409 1410 /// <summary> 1411 /// 烤鸡翅 1412 /// </summary> 1413 public class BakeChickenWingCommand : Command 1414 { 1415 public BakeChickenWingCommand(Barbecuer receiver) 1416 : base(receiver) 1417 { 1418 } 1419 1420 public override void ExcuteCommand() 1421 { 1422 receiver.BakeChickenWing(); 1423 } 1424 } 1425 1426 /// <summary> 1427 /// 服务员 1428 /// </summary> 1429 public class Waiter 1430 { 1431 private IList<Command> orders = new List<Command>(); 1432 1433 public void SetOrder(Command command) 1434 { 1435 if (command.ToString() == "dhsjmsStudy.BakeChickenWingCommand") 1436 { 1437 Console.WriteLine("鸡翅卖完了!"); 1438 } 1439 else 1440 { 1441 orders.Add(command); 1442 Console.WriteLine("添加订单:" + command + " 时间:" + DateTime.Now); 1443 } 1444 } 1445 1446 public void CancelOrder(Command command) 1447 { 1448 orders.Remove(command); 1449 Console.WriteLine("取消订单:" + command + " 时间:" + DateTime.Now); 1450 } 1451 1452 public void Notify() 1453 { 1454 foreach (Command command in orders) 1455 { 1456 command.ExcuteCommand(); 1457 } 1458 } 1459 } 1460 1461 #endregion 1462 1463 #region 责任链模式 1464 1465 public class Request 1466 { 1467 public string requestType { get; set; } 1468 public string requestContent { get; set; } 1469 public int numBer { get; set; } 1470 } 1471 1472 /// <summary> 1473 /// 管理者 1474 /// </summary> 1475 public abstract class Manager 1476 { 1477 protected string name; 1478 1479 //管理者的上级 1480 protected Manager superior; 1481 1482 public Manager(string name) 1483 { 1484 this.name = name; 1485 } 1486 1487 //设置管理者的上级 1488 public void SetSuperior(Manager superior) 1489 { 1490 this.superior = superior; 1491 } 1492 1493 public abstract void RequestApplications(Request request); 1494 } 1495 1496 /// <summary> 1497 /// 经理 1498 /// </summary> 1499 public class CommonManager : Manager 1500 { 1501 public CommonManager(string name) 1502 : base(name) 1503 { 1504 } 1505 1506 public override void RequestApplications(Request request) 1507 { 1508 if (request.requestType == "请假" && request.numBer <= 2) 1509 { 1510 Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.requestContent, request.numBer); 1511 } 1512 else 1513 { 1514 if (null != superior) 1515 superior.RequestApplications(request); 1516 } 1517 } 1518 } 1519 1520 /// <summary> 1521 /// 总监 1522 /// </summary> 1523 public class Majordomo : Manager 1524 { 1525 public Majordomo(string name) 1526 : base(name) 1527 { 1528 } 1529 1530 public override void RequestApplications(Request request) 1531 { 1532 if (request.requestType == "请假" && request.numBer <= 5) 1533 { 1534 Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.requestContent, request.numBer); 1535 } 1536 else 1537 { 1538 if (null != superior) 1539 superior.RequestApplications(request); 1540 } 1541 } 1542 } 1543 1544 1545 /// <summary> 1546 /// 总经理 1547 /// </summary> 1548 public class GeneralManager : Manager 1549 { 1550 public GeneralManager(string name) 1551 : base(name) 1552 { 1553 } 1554 1555 public override void RequestApplications(Request request) 1556 { 1557 if (request.requestType == "请假") 1558 { 1559 Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.requestContent, request.numBer); 1560 } 1561 else if (request.requestType == "加薪" && request.numBer <= 500) 1562 { 1563 Console.WriteLine("{0}:{1} 数量{2} 被批准", name, request.requestContent, request.numBer); 1564 } 1565 else if (request.requestType == "加薪" && request.numBer > 500) 1566 { 1567 Console.WriteLine("{0}:{1} 数量{2} 再说吧", name, request.requestContent, request.numBer); 1568 } 1569 1570 } 1571 } 1572 #endregion 1573 1574 #region 中介者模式 1575 /// <summary> 1576 /// 抽象中介类 1577 /// </summary> 1578 public abstract class Mediator 1579 { 1580 public abstract void Send(string message, Colleague colleague); 1581 } 1582 1583 public class ConcreteMediator : Mediator 1584 { 1585 private ConcreteMediator1 col1; 1586 private ConcreteMediator2 col2; 1587 1588 public ConcreteMediator1 Col1 1589 { 1590 set { col1 = value; } 1591 } 1592 1593 public ConcreteMediator2 Col2 1594 { 1595 set { col2 = value; } 1596 } 1597 public override void Send(string message, Colleague colleague) 1598 { 1599 if (colleague == col1) 1600 { 1601 col2.Notify(message); 1602 } 1603 else 1604 { 1605 col1.Notify(message); 1606 } 1607 } 1608 } 1609 1610 /// <summary> 1611 /// 抽象同事类 1612 /// </summary> 1613 public abstract class Colleague 1614 { 1615 protected Mediator mediator; 1616 1617 public Colleague(Mediator mediator) 1618 { 1619 this.mediator = mediator; 1620 } 1621 } 1622 public class ConcreteMediator1 : Colleague 1623 { 1624 public ConcreteMediator1(Mediator mediator) 1625 : base(mediator) 1626 { 1627 } 1628 1629 public void Send(string message) 1630 { 1631 mediator.Send(message, this); 1632 } 1633 1634 public void Notify(string message) 1635 { 1636 Console.WriteLine("同事1得到的消息:" + message); 1637 } 1638 } 1639 1640 public class ConcreteMediator2 : Colleague 1641 { 1642 public ConcreteMediator2(Mediator mediator) 1643 : base(mediator) 1644 { 1645 } 1646 1647 public void Send(string message) 1648 { 1649 mediator.Send(message, this); 1650 } 1651 1652 public void Notify(string message) 1653 { 1654 Console.WriteLine("同事2得到的消息:" + message); 1655 } 1656 } 1657 #endregion 1658 1659 #region 享元模式 1660 1661 public abstract class Flyweight 1662 { 1663 public abstract void Operation(int extrinsicstate); 1664 } 1665 1666 public class ConcreteFlyweight : Flyweight 1667 { 1668 public override void Operation(int extrinsicstate) 1669 { 1670 Console.WriteLine("具体Flyweight:" + extrinsicstate); 1671 } 1672 } 1673 1674 public class UnshareConcreteFlyweight : Flyweight 1675 { 1676 public override void Operation(int extrinsicstate) 1677 { 1678 Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate); 1679 } 1680 } 1681 1682 public class FlyweightFactory 1683 { 1684 private Hashtable flyweights = new Hashtable(); 1685 1686 public FlyweightFactory() 1687 { 1688 flyweights.Add("X", new ConcreteFlyweight()); 1689 flyweights.Add("Y", new ConcreteFlyweight()); 1690 flyweights.Add("Z", new ConcreteFlyweight()); 1691 } 1692 1693 public Flyweight GetFlyweight(string key) 1694 { 1695 return ((Flyweight)flyweights[key]); 1696 } 1697 } 1698 #region 网站享元 1699 1700 public abstract class WebSite 1701 { 1702 public abstract void Use(); 1703 } 1704 1705 /// <summary> 1706 /// 具体网站 1707 /// </summary> 1708 public class ConcreteWebSite : WebSite 1709 { 1710 private string _name; 1711 1712 public ConcreteWebSite(string name) 1713 { 1714 this._name = name; 1715 } 1716 1717 public override void Use() 1718 { 1719 Console.WriteLine("网站分类:" + _name); 1720 } 1721 } 1722 1723 /// <summary> 1724 /// 网站工厂类 1725 /// </summary> 1726 public class WebSiteFactory 1727 { 1728 private Hashtable flyweights = new Hashtable(); 1729 1730 //获取网站分类 1731 public WebSite GetWebSiteCategory(string key) 1732 { 1733 if (!flyweights.ContainsKey(key)) 1734 flyweights.Add(key, new ConcreteWebSite(key)); 1735 return ((WebSite)flyweights[key]); 1736 } 1737 1738 public int GetWebSiteCount() 1739 { 1740 return flyweights.Count; 1741 } 1742 } 1743 1744 #endregion 1745 #endregion 1746 1747 #region 解释器模式 1748 1749 public class Context1 1750 { 1751 public string inPut { get; set; } 1752 1753 public string outPut { get; set; } 1754 } 1755 1756 public class TerminalExpression : AbstractExpression 1757 { 1758 public override void Interpret(Context1 context) 1759 { 1760 Console.WriteLine("终端解释器"); 1761 } 1762 } 1763 1764 public abstract class AbstractExpression 1765 { 1766 public abstract void Interpret(Context1 context); 1767 } 1768 1769 public class NoterminalExpression : AbstractExpression 1770 { 1771 public override void Interpret(Context1 context) 1772 { 1773 Console.WriteLine("非终端解释器"); 1774 } 1775 } 1776 1777 1778 #endregion 1779 1780 #region 访问者模式 1781 1782 public abstract class Visitor 1783 { 1784 public abstract void VisitorConcreteElementA(ConcreteElementA A); 1785 public abstract void VisitorConcreteElementB(ConcreteElementB B); 1786 } 1787 1788 public class ConcreteVisitorA : Visitor 1789 { 1790 public override void VisitorConcreteElementA(ConcreteElementA A) 1791 { 1792 Console.WriteLine("{0}被{1}访问", A.GetType().Name, this.GetType().Name); 1793 } 1794 1795 public override void VisitorConcreteElementB(ConcreteElementB B) 1796 { 1797 Console.WriteLine("{0}被{1}访问", B.GetType().Name, this.GetType().Name); 1798 } 1799 } 1800 1801 public class ConcreteVisitorB : Visitor 1802 { 1803 public override void VisitorConcreteElementA(ConcreteElementA A) 1804 { 1805 Console.WriteLine("{0}被{1}访问", A.GetType().Name, this.GetType().Name); 1806 } 1807 1808 public override void VisitorConcreteElementB(ConcreteElementB B) 1809 { 1810 Console.WriteLine("{0}被{1}访问", B.GetType().Name, this.GetType().Name); 1811 } 1812 } 1813 1814 public abstract class Element 1815 { 1816 public abstract void Accept(Visitor visitor); 1817 } 1818 1819 public class ConcreteElementA : Element 1820 { 1821 public override void Accept(Visitor visitor) 1822 { 1823 visitor.VisitorConcreteElementA(this); 1824 } 1825 1826 public void OperationA() 1827 { 1828 1829 } 1830 } 1831 1832 public class ConcreteElementB : Element 1833 { 1834 public override void Accept(Visitor visitor) 1835 { 1836 visitor.VisitorConcreteElementB(this); 1837 } 1838 1839 public void OperationB() 1840 { 1841 1842 } 1843 } 1844 1845 /// <summary> 1846 /// 提供高层接口,允许访问者访问 1847 /// </summary> 1848 public class ObjectStructure 1849 { 1850 private IList<Element> elements = new List<Element>(); 1851 1852 public void Attach(Element element) 1853 { 1854 elements.Add(element); 1855 } 1856 1857 public void Detach(Element element) 1858 { 1859 elements.Remove(element); 1860 } 1861 1862 public void Accept(Visitor visitor) 1863 { 1864 foreach (Element e in elements) 1865 { 1866 e.Accept(visitor); 1867 } 1868 } 1869 } 1870 1871 #endregion 1872 class Program 1873 { 1874 1875 public static operation CreateOperate(string operate) 1876 { 1877 operation oper = null; 1878 switch (operate) 1879 { 1880 case "+": 1881 oper = new Add(); 1882 break; 1883 case "-": 1884 oper = new Sub(); 1885 break; 1886 case "*": 1887 oper = new Div(); 1888 break; 1889 case "/": 1890 oper = new Mlu(); 1891 break; 1892 } 1893 return oper; 1894 } 1895 1896 public static CashSuper CreateCashAccept(string type) 1897 { 1898 CashSuper cs = null; 1899 switch (type) 1900 { 1901 case "正常消费": 1902 cs = new CashNormal(); 1903 break; 1904 case "满300返100": 1905 cs = new CashReturn("300", "100"); 1906 break; 1907 case "打八折": 1908 cs = new CashRebate("0.8"); 1909 break; 1910 } 1911 return cs; 1912 } 1913 1914 static void Main(string[] args) 1915 { 1916 #region 简单工厂模式 1917 //operation oper = Program.CreateOperate("*"); 1918 //oper.numberB = 10; 1919 //oper.numberA = 11; 1920 //Console.WriteLine(oper.GetResult()); 1921 #endregion 1922 1923 #region 策略模式与简单工厂组合 1924 //CashContext cc = new CashContext("满300返100"); 1925 //double totalPrices = cc.GetResult(10000); 1926 //Console.WriteLine(totalPrices); 1927 #endregion 1928 1929 #region 单一原则 1930 //如果一个类承担的职责过多,就等于把这些职责耦合在一起。 1931 //一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。 1932 //这种耦合会导致脆弱的设计,当发生变化时,设计会遭受意想不到的破坏【ASD】。 1933 1934 //软件设计真正要做的许多内容,就是发现职责并相互分离。 1935 //如果你能够想到多于一个的动机去改变一个类,那么这个类就具备多于一个的职责, 1936 //就应该考虑类的职责分离。 1937 #endregion 1938 1939 #region 开放-封闭原则 1940 //(大话代码结构)将BLL的业务逻辑开放,将修改等数据处理封闭。 1941 1942 //(大话设计模式)软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。 1943 //对于扩展是开放的,对于更改是封闭的。 1944 1945 //对于需求、程序改动是通过增加新代码进行的,而不是更改现有代码。 1946 #endregion 1947 1948 #region 依赖倒转原则 1949 //针对于接口编程,不要对实现编程。 1950 1951 //A.高层模块不应该依赖底层模块。两个都依赖抽象。 1952 //B.抽象不应依赖细节,细节应依赖抽象。 1953 #endregion 1954 1955 #region 里氏代换原则 1956 //子类型必须能够替换它们的父类型。 1957 #endregion 1958 1959 #region 装饰模式 1960 //动态地给一个对象添加一些额外的职能, 1961 //就增加功能来说,装饰模式比生成子类更灵活 1962 1963 //Person ly = new Person("蝼蚁"); 1964 //Console.WriteLine("第一种装扮:"); 1965 //Finery dtx = new Tshirts(); 1966 //Finery kk = new BigTrouser(); 1967 //dtx.Decorate(ly); 1968 //kk.Decorate(dtx); 1969 //kk.Show(); 1970 #endregion 1971 1972 #region 代理模式 1973 ////为其他对象提供一种代理以控制对这个对象的访问 1974 //BZQ jiaojiao = new BZQ(); 1975 //jiaojiao.Name = "娇娇"; 1976 1977 //代理人 daili = new 代理人(jiaojiao); 1978 //daili.SH(); 1979 //daili.WatchTv(); 1980 #endregion 1981 1982 #region 工厂方法模式 1983 //I工厂 operFactory = new AddFactory(); 1984 //operation oper = operFactory.CreateOperation(); 1985 //oper.numberA = 1; 1986 //oper.numberB = 2; 1987 //Console.WriteLine(oper.GetResult()); 1988 1989 ////大学生和志愿者可以通过实例化不同类实现。 1990 ////IFactory factory= new UndergraduateFactory(); 1991 //IFactory factory = new VolunteerFactory(); 1992 //LeiFeng leifeng = factory.CreateLeiFeng(); 1993 //leifeng.BuyRice(); 1994 //leifeng.Sweep(); 1995 //leifeng.Wash(); 1996 1997 #endregion 1998 1999 #region 原型模式 2000 ////用原型实例指定创建对象的种类, 2001 ////并通过拷贝这些原型创建新的对象。 2002 2003 ////ConcretePrototype pl = new ConcretePrototype("I"); 2004 ////ConcretePrototype cl = (ConcretePrototype)pl.Clone(); 2005 2006 ////Console.WriteLine("Clone:{0}", cl.Id); 2007 ////Clone复制结构不复制数据 2008 ////Copy复制结构也复制数据 2009 2010 //Resume a = new Resume("test"); 2011 //a.SetPersonalInfo("男", "22"); 2012 //a.SetWorkExperience("1995-2018", "xx公司"); 2013 2014 ////此处Clone()=>实则是在重新实例化一个Resume再赋值 2015 //Resume b = (Resume)a.Clone(); 2016 //b.SetWorkExperience("1998-2006", "yy公司"); 2017 2018 //Resume c = (Resume)a.Clone(); 2019 //c.SetWorkExperience("1998-2006", "zz公司"); 2020 2021 //a.Display(); 2022 //b.Display(); 2023 //c.Display(); 2024 #endregion 2025 2026 #region 模板方法模式 2027 ////定义一个操作中的算法的骨架, 2028 ////而将一些步骤延迟到子类中。 2029 ////使得子类可以不改变一个算法的结构 2030 ////即可重定义该算法的某些特定步骤。 2031 //Console.WriteLine("考试A"); 2032 //TestPaper studentA = new TestPaperA(); 2033 //studentA.TestQuestion1(); 2034 //studentA.TestQuestion2(); 2035 //studentA.TestQuestion3(); 2036 2037 //Console.WriteLine("考试B"); 2038 //TestPaper studentB = new TestPaperB(); 2039 //studentB.TestQuestion1(); 2040 //studentB.TestQuestion2(); 2041 //studentB.TestQuestion3(); 2042 2043 #endregion 2044 2045 #region 迪米特法则 2046 //如果两个类不必彼此直接通信, 2047 //那么这两个类就不应当发生直接的相互作用。 2048 //如果其中一个类需要调用另一个类的某一个方法的话, 2049 //可以通过第三者转发这个调用。 2050 2051 //如果再公司电脑坏了,可以寻求该IT部门,而不是直接找某个人。 2052 #endregion 2053 2054 #region 外观模式 2055 ////为子系统中的一组接口提供一个一致的界面, 2056 ////此模式定义了一个高层接口,使得子系统更容易使用。 2057 ////遇到复杂庞大的系统维护时,我们可添加一个简单的接口, 2058 ////减少它们之间的依赖。 2059 2060 ////Stock1 gu1 = new Stock1(); 2061 ////Stock2 gu2 = new Stock2(); 2062 2063 ////gu1.Buy(); 2064 ////gu2.Buy(); 2065 2066 ////gu1.Sell(); 2067 ////gu2.Sell(); 2068 2069 //Fund jijin = new Fund(); 2070 //jijin.BuyFund(); 2071 //jijin.SellFund(); 2072 #endregion 2073 2074 #region 建造者模式 2075 ////将一个复杂对象的构造与它的表示分离, 2076 ////使得同样的构造过程可以创建不同的表示。 2077 2078 //Director director = new Director(); 2079 //Builder b1 = new ConcreteBuilder1(); 2080 //Builder b2 = new ConcreteBuilder2(); 2081 2082 //director.Construct(b1); 2083 //Product p1 = b1.GetResult(); 2084 //p1.Show(); 2085 2086 //director.Construct(b2); 2087 //Product p2 = b2.GetResult(); 2088 //p2.Show(); 2089 #endregion 2090 2091 #region 观察者模式 2092 ////定义一种一对多的依赖关系, 2093 ////让多个观察者对象同时监听某一个主题对象。 2094 ////当这个主题对象变化时,会通知所有观察对象, 2095 ////使它们能自动更新自己。 2096 2097 //Secretary qiantai = new Secretary(); 2098 //StockObserver tongzhi1 = new StockObserver("通知人1", qiantai); 2099 //StockObserver tongzhi2 = new StockObserver("通知人2", qiantai); 2100 2101 //qiantai.Attach(tongzhi1); 2102 //qiantai.Attach(tongzhi2); 2103 2104 //qiantai.SecretaryAction = "老板来了!"; 2105 //qiantai.Notify(); 2106 2107 #region 最终版 2108 //Boss huhansan = new Boss(); 2109 2110 //StockObserver tongzhi1 = new StockObserver("通知人1", huhansan); 2111 //NBAObserver tongzhi2 = new NBAObserver("通知人2", huhansan); 2112 2113 //huhansan.Attach(tongzhi1); 2114 //huhansan.Attach(tongzhi2); 2115 2116 //huhansan.Detach(tongzhi1); 2117 2118 //huhansan.SubjectState = "我胡汉三又回来啦"; 2119 2120 //huhansan.Notify(); 2121 #endregion 2122 2123 #region 事件委托 2124 //Boss huhansan = new Boss(); 2125 2126 //StockObserver tongzhi1 = new StockObserver("通知人1", huhansan); 2127 //NBAObserver tongzhi2 = new NBAObserver("通知人2", huhansan); 2128 //huhansan.Update += new EventHandler(tongzhi1.CloseStockMarket);//应该是把tongzhi1对象给一起传入方法了。 2129 //huhansan.Update += new EventHandler(tongzhi2.CloseNBA); 2130 //huhansan.SubjectState = "我胡汉三又回来啦"; 2131 //huhansan.Notify1(); 2132 #endregion 2133 #endregion 2134 2135 #region 抽象工厂模式 2136 //提供一个创建一系列相关或相互依赖对象的接口, 2137 //而无需指定它们的具体类。 2138 2139 //User user = new User(); 2140 //IFactoryDB factory = new SqlServerFactory(); 2141 //IUser iu = factory.CreateUser(); 2142 //iu.Insert(user); 2143 //iu.GetUser(1); 2144 2145 //用反射+抽象工厂的数据访问程序 2146 2147 #endregion 2148 2149 #region 状态模式 2150 ////当一个对象的内在状态改变时允许改变其行为, 2151 ////这个对象看起来像是改变了其类。 2152 2153 //Context c = new Context(new ConcreteStateA()); 2154 //c.Request(); 2155 //c.Request(); 2156 //c.Request(); 2157 //c.Request(); 2158 #endregion 2159 2160 #region 适配器模式 2161 //将一个类的接口转换成客户希望的另一个接口, 2162 //Adapter模式使得原本由于接口不兼容而不能一起工作的类, 2163 //可以一起工作。 2164 2165 //Target target = new Adapter(); 2166 //target.Request(); 2167 #endregion 2168 2169 #region 备忘录模式 2170 ////在不破坏封装性的前提下, 2171 ////捕获一个对象的内部状态, 2172 ////并在该对象之外保存这个状态。 2173 //Originator o = new Originator(); 2174 //o.state = "On"; 2175 //o.Show(); 2176 2177 //Caretaker c = new Caretaker(); 2178 //c.memento = o.CreateMemento(); 2179 2180 //o.state = "off"; 2181 //o.Show(); 2182 2183 //o.SetMemento(c.memento); 2184 //o.Show(); 2185 2186 #endregion 2187 2188 #region 组合模式 2189 ////将对象组合成树形结构以表示“部分-整体”的层次结构。 2190 ////组合模式使得用户对单个对象和组合对象的使用具有一致性。 2191 2192 ////生成根节点 2193 //Composite root = new Composite("root"); 2194 //root.Add(new Leaf("Leaf A")); 2195 //root.Add(new Leaf("Leaf B")); 2196 2197 ////根上长出分支 2198 //Composite comp = new Composite("Composite X"); 2199 //comp.Add(new Leaf("Leaf XA")); 2200 //comp.Add(new Leaf("Leaf XB")); 2201 2202 //root.Add(comp); 2203 2204 //Composite comp2 = new Composite("Composite XY"); 2205 //comp.Add(new Leaf("Leaf XYA")); 2206 //comp.Add(new Leaf("Leaf XYB")); 2207 2208 //comp.Add(comp2); 2209 //root.Add(new Leaf("Leaf C")); 2210 2211 //Leaf leaf = new Leaf("Leaf D"); 2212 //root.Add(leaf); 2213 //root.Remove(leaf); 2214 2215 ////显示大树 2216 //root.Display(1); 2217 #endregion 2218 2219 #region 迭代器模式 2220 //ConcreteAggregate a = new ConcreteAggregate(); 2221 //for (int i = 0; i < 10; i++) 2222 //{ 2223 // a[i] = i; 2224 //} 2225 2226 //Iterator i1 = new ConcreteIterator(a); 2227 //while (!i1.IsDone()) 2228 //{ 2229 // Console.WriteLine("{0} 请买票!", i1.CurrentItem()); 2230 // i1.Next(); 2231 //} 2232 #endregion 2233 2234 #region 单例模式 2235 ////保证一个类仅有一个实例, 2236 ////并提供一个访问它的全局访问点。 2237 2238 //Singleton s1 = Singleton.GetInstance(); 2239 //Singleton s2 = Singleton.GetInstance(); 2240 2241 //if (s1 == s2) 2242 // Console.WriteLine("相同实例"); 2243 2244 2245 #endregion 2246 2247 #region 桥接模式 2248 //将抽象部分与它的实现部分分离, 2249 //使它们都可以独立变化。 2250 2251 //同样一个东西,运行在不同平台。 2252 //只要把东西弄好,其他平台继承后实现父类即可。 2253 2254 ////HandsetGame a; 2255 ////a = new HandsetMGame(); 2256 ////a.Run(); 2257 2258 ////a= new HandsetNGame(); 2259 ////a.Run(); 2260 2261 //HandsetBrand hb; 2262 //hb = new HandsetBrandM(); 2263 2264 //hb.SetHandsetSoft(new HandsetGame()); 2265 //hb.Run(); 2266 2267 //hb.SetHandsetSoft(new HandsetAddressList()); 2268 //hb.Run(); 2269 2270 //hb = new HandsetBrandN(); 2271 2272 //hb.SetHandsetSoft(new HandsetGame()); 2273 //hb.Run(); 2274 2275 //hb.SetHandsetSoft(new HandsetAddressList()); 2276 //hb.Run(); 2277 2278 #endregion 2279 2280 #region 合成/聚合复用原则 2281 //尽量使用合成/聚合, 2282 //尽量不要使用类继承 2283 #endregion 2284 2285 #region 命令模式 2286 ////将一个请求封装为一个对象, 2287 ////从而使你可用不同的请求对客户进行参数化; 2288 ////对请求排队或记录请求日志,以及支持可撤销的操作。 2289 //Barbecuer boy = new Barbecuer(); 2290 //Command c1 = new BakeMuttonCommand(boy); 2291 //Command c2 = new BakeMuttonCommand(boy); 2292 //Command c3 = new BakeChickenWingCommand(boy); 2293 2294 //Waiter girl = new Waiter(); 2295 //girl.SetOrder(c1); 2296 //girl.SetOrder(c2); 2297 //girl.SetOrder(c3); 2298 2299 //girl.Notify(); 2300 2301 #endregion 2302 2303 #region 责任链模式 2304 ////使多个对象都有机会处理请求, 2305 ////从而避免请求的发送者和接收者的耦合关系。 2306 ////将这个对象连成一条链,并沿着这条链传递该请求, 2307 ////直到有一个对象处理它为止。 2308 //CommonManager jinli = new CommonManager("金立"); 2309 //Majordomo zongjian = new Majordomo("宗建"); 2310 //GeneralManager zongjingli = new GeneralManager("宗金丽"); 2311 2312 //jinli.SetSuperior(zongjian); 2313 //zongjian.SetSuperior(zongjingli); 2314 2315 //Request request = new Request(); 2316 //request.requestType = "请假"; 2317 //request.requestContent = "小菜请假"; 2318 //request.numBer = 1; 2319 //jinli.RequestApplications(request); 2320 2321 //Request request2 = new Request(); 2322 //request2.requestType = "请假"; 2323 //request2.requestContent = "小菜请假"; 2324 //request2.numBer = 1; 2325 //jinli.RequestApplications(request2); 2326 2327 //Request request3 = new Request(); 2328 //request3.requestType = "加薪"; 2329 //request3.requestContent = "小菜请求加薪"; 2330 //request3.numBer = 500; 2331 //jinli.RequestApplications(request3); 2332 2333 //Request request4 = new Request(); 2334 //request4.requestType = "加薪"; 2335 //request4.requestContent = "小菜请求加薪"; 2336 //request4.numBer = 1000; 2337 //jinli.RequestApplications(request4); 2338 #endregion 2339 2340 #region 中介者模式 2341 //用一个中介对象来封装一系列的对象交互, 2342 //中介者使各对象不需要显式地互相调用, 2343 //从而使其耦合松散,而且可以独立地改变它们之间的交互。 2344 2345 ConcreteMediator m = new ConcreteMediator(); 2346 ConcreteMediator1 c1 = new ConcreteMediator1(m); 2347 ConcreteMediator2 c2 = new ConcreteMediator2(m); 2348 2349 m.Col1 = c1; 2350 m.Col2 = c2; 2351 2352 c1.Send("发送消息"); 2353 c2.Send("收到消息"); 2354 2355 #endregion 2356 2357 #region 享元模式 2358 //////运用共享技术有效地支持大量细粒度的对象。 2359 ////int ext = 22; 2360 2361 ////FlyweightFactory f = new FlyweightFactory(); 2362 2363 ////Flyweight fx = f.GetFlyweight("X"); 2364 ////fx.Operation(--ext); 2365 2366 ////Flyweight fy = f.GetFlyweight("Y"); 2367 ////fy.Operation(--ext); 2368 2369 ////Flyweight fz = f.GetFlyweight("Z"); 2370 ////fz.Operation(--ext); 2371 2372 ////UnshareConcreteFlyweight uf = new UnshareConcreteFlyweight(); 2373 ////uf.Operation(--ext); 2374 2375 //WebSiteFactory f = new WebSiteFactory(); 2376 2377 //WebSite fx = f.GetWebSiteCategory("产品展示"); 2378 //fx.Use(); 2379 2380 //WebSite fy = f.GetWebSiteCategory("产品展示"); 2381 //fy.Use(); 2382 2383 //WebSite f1 = f.GetWebSiteCategory("博客"); 2384 //f1.Use(); 2385 2386 //WebSite f2 = f.GetWebSiteCategory("博客"); 2387 //f2.Use(); 2388 2389 //Console.WriteLine("网站分类总数为{0}",f.GetWebSiteCount()); 2390 #endregion 2391 2392 #region 解释器模式 2393 ////给定一个语言,定义它的文法的一种表示, 2394 ////并定义一个解释器, 2395 ////这个解释器使用该表示来解释语言中的句子。 2396 //Context1 context = new Context1(); 2397 //IList<AbstractExpression> list = new List<AbstractExpression>(); 2398 //list.Add(new TerminalExpression()); 2399 //list.Add(new NoterminalExpression()); 2400 //list.Add(new TerminalExpression()); 2401 //list.Add(new TerminalExpression()); 2402 2403 //foreach (AbstractExpression exp in list) 2404 //{ 2405 // exp.Interpret(context); 2406 //} 2407 #endregion 2408 2409 #region 访问者模式 2410 ////表示一个作用于某对象结构的各元素操作。 2411 ////它使你可以在不改变各元素的类的前提下 2412 ////定义作用于这些元素的新操作。 2413 //ObjectStructure o = new ObjectStructure(); 2414 //o.Attach(new ConcreteElementA()); 2415 //o.Attach(new ConcreteElementB()); 2416 2417 //ConcreteVisitorA v1 = new ConcreteVisitorA(); 2418 //ConcreteVisitorB v2 = new ConcreteVisitorB(); 2419 //o.Accept(v1); 2420 //o.Accept(v2); 2421 #endregion 2422 } 2423 } 2424 }
好好学习,天天向上。