zoukankan      html  css  js  c++  java
  • 【自学】大话设计模式控制台

       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 }
    大话设计模式代码

    源码地址: https://github.com/doyoulaikeme/DesignPatterns

    好好学习,天天向上。
  • 相关阅读:
    python split的用法
    大学排名爬虫
    一直在报错:ModuleNotFoundError: No module named 'bs4'.
    微信小程序部署到线上环境
    mybatis关联三张表查询对应字段名
    WPF图像裁剪控件
    git创建标签并推送到远程
    Windows7、10的热键屏蔽
    WPF使用SVG简单整理
    Visual Studio 注册码和下载
  • 原文地址:https://www.cnblogs.com/Zhengxue/p/8807807.html
Copyright © 2011-2022 走看看