码迷,mamicode.com
首页 > 其他好文 > 详细

命令模式

时间:2014-09-04 20:38:50      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   2014   

【1】什么是命令模式?

命令模式:

【2】命令模式的代码示例:

代码示例:

bubuko.com,布布扣
   1 #if 0
   2 
   3 #include <iostream>
   4 #include <string>
   5 using namespace std;
   6 
   7 /*
   8  * 运算基类
   9  */
  10 class Operation
  11 {
  12 public:
  13     double numberA;
  14     double numberB;
  15 public:
  16     virtual double  getResult()
  17     {
  18         return 0;
  19     }
  20 };
  21 
  22 /*
  23  * 加法运算子类
  24  */
  25 class addOperation : public Operation
  26 {
  27     double getResult()
  28     {
  29         return numberA + numberB;
  30     }
  31 };
  32 
  33  /*
  34   * 减法运算子类
  35   */
  36 class subOperation : public Operation
  37 {
  38     double getResult()
  39     {
  40         return numberA - numberB;
  41     }
  42 };
  43 
  44  /*
  45   * 乘法运算子类
  46   */
  47 class mulOperation : public Operation
  48 {
  49     double getResult()
  50     {
  51         return numberA * numberB;
  52     }
  53 };
  54 
  55  /*
  56   * 除法运算子类
  57   */
  58 class divOperation : public Operation
  59 {
  60     double getResult()
  61     {
  62         return numberA / numberB;
  63     }
  64 };
  65 
  66  /*
  67   * 简单构建工厂
  68   */
  69 class operFactory
  70 {
  71 public:
  72     static Operation *createOperation(char c)
  73     {
  74         switch (c)
  75         {
  76         case +:
  77             return new addOperation;
  78             break;
  79         case -:
  80             return new subOperation;
  81             break;
  82         case *:
  83             return new mulOperation;
  84             break;
  85         case /:
  86             return new divOperation;
  87             break;
  88         default:
  89             break;
  90         }
  91     }
  92 };
  93 
  94  /*
  95   * 客户端应用示例
  96   */
  97 void main()
  98 {
  99     Operation *oper = operFactory::createOperation(+);
 100     oper->numberA = 9;
 101     oper->numberB = 99;
 102     cout << oper->getResult() << endl;
 103 }
 104 
 105  /*
 106   * 简单工厂模式应用示例
 107   */
 108 #include <iostream>
 109 #include <cmath>
 110 #include <string>
 111 using namespace std;
 112 
 113 class CashSuper
 114 {
 115 public:
 116     virtual double acceptMoney(double money) = 0;
 117 };
 118 
 119 class CashNormal : public CashSuper
 120 {
 121 public:
 122     double acceptMoney(double money)
 123     {
 124         return money;
 125     }
 126 };
 127 
 128 class CashRebate : public CashSuper
 129 {
 130 private:
 131     double discount;
 132 public:
 133     CashRebate(double dis)
 134     {
 135         discount = dis;
 136     }
 137     double acceptMoney(double money)
 138     {
 139         return money * discount;
 140     }
 141 };
 142 
 143 
 144 class CashReturn : public CashSuper
 145 {
 146 private:
 147     double moneyCondition;
 148     double moneyReturn;
 149 public:
 150     CashReturn(double mc, double mr)
 151     {
 152         moneyCondition = mc;
 153         moneyReturn = mr;
 154     }
 155     double acceptMoney(double money)
 156     {
 157         double result = money;
 158         if (money >= moneyCondition)
 159         {
 160             result = money - floor(money / moneyCondition) * moneyReturn;
 161         }
 162         return result;
 163     }
 164 };
 165 
 166 class CashFactory
 167 {
 168 public:
 169     static CashSuper *createCashAccept(string str)
 170     {
 171         CashSuper *cs = NULL;
 172         if ("正常收费" == str)
 173         {
 174             return new CashNormal();
 175         }
 176         else if ("打9折" == str)
 177         {
 178             return new CashRebate(0.9);
 179         }
 180         else if ("满300返200" == str)
 181         {
 182             return new CashReturn(300, 200);
 183         }
 184         return cs;
 185     }
 186 };
 187 
 188 
 189 void main()
 190 {
 191     CashSuper *cs = NULL;
 192     
 193     cs = CashFactory::createCashAccept("打9折");
 194     cout << cs->acceptMoney(1000) << endl;
 195 
 196     cs = CashFactory::createCashAccept("正常收费");
 197     cout << cs->acceptMoney(1000) << endl;
 198 }
 199 
 200 
 201 
 202 
 203  /*
 204   * 策略模式
 205   */
 206 
 207 #include <iostream>
 208 #include <cmath>
 209 #include <string>
 210 using namespace std;
 211 
 212 class CashSuper
 213 {
 214 public:
 215     virtual double acceptMoney(double money) = 0;
 216 };
 217 
 218 class CashNormal : public CashSuper
 219 {
 220 public:
 221     double acceptMoney(double money)
 222     {
 223         return money;
 224     }
 225 };
 226 
 227 class CashRebate : public CashSuper
 228 {
 229 private:
 230     double discount;
 231 
 232 public:
 233     CashRebate(double dis)
 234     {
 235         discount = dis;
 236     }
 237     double acceptMoney(double money)
 238     {
 239         return money * discount;
 240     }
 241 };
 242 
 243 
 244 class CashReturn : public CashSuper
 245 {
 246 private:
 247     double moneyCondition;
 248     double moneyReturn;
 249 
 250 public:
 251     CashReturn(double mc, double mr)
 252     {
 253         moneyCondition = mc;
 254         moneyReturn = mr;
 255     }
 256     double acceptMoney(double money)
 257     {
 258         double result = money;
 259         if (money >= moneyCondition)
 260         {
 261             result = money - floor(money / moneyCondition) * moneyReturn;
 262         }
 263         return result;
 264     }
 265 };
 266 
 267 class  CashContext
 268 {
 269 private:
 270     CashSuper *cs;
 271 public:
 272     CashContext(CashSuper *cs)
 273     {
 274         this->cs = cs;
 275     }
 276     double getResult(double money)
 277     {
 278         return cs->acceptMoney(money);
 279     }
 280 };
 281 
 282 void main()
 283 {
 284     CashSuper *cs;
 285     CashContext *cc;
 286     double money = 1000;
 287 
 288     cs = new CashRebate(0.8);
 289     cc = new CashContext(cs);
 290     cout << cc->getResult(money) << endl;
 291 
 292     money = 1000;
 293     cs = new CashNormal();
 294     cc = new CashContext(cs);
 295     cout << cc->getResult(money) << endl;
 296 
 297 }
 298 
 299 
 300 
 301  /*
 302   * 策略与工厂模式
 303   */
 304 #include <iostream>
 305 #include <cmath>
 306 #include <string>
 307 using namespace std;
 308 
 309 class CashSuper
 310 {
 311 public:
 312     virtual double acceptMoney(double money) = 0;
 313 };
 314 
 315 class CashNormal : public CashSuper
 316 {
 317 public:
 318     double acceptMoney(double money)
 319     {
 320         return money;
 321     }
 322 };
 323 
 324 class CashRebate : public CashSuper
 325 {
 326 private:
 327     double discount;
 328 public:
 329     CashRebate(double dis)
 330     {
 331         discount = dis;
 332     }
 333     double acceptMoney(double money)
 334     {
 335         return money * discount;
 336     }
 337 };
 338 
 339 
 340 class CashReturn : public CashSuper
 341 {
 342 private:
 343     double moneyCondition;
 344     double moneyReturn;
 345 public:
 346     CashReturn(double mc, double mr)
 347     {
 348         moneyCondition = mc;
 349         moneyReturn = mr;
 350     }
 351     double acceptMoney(double money)
 352     {
 353         double result = money;
 354         if (money >= moneyCondition)
 355         {
 356             result = money - floor(money / moneyCondition) * moneyReturn;
 357         }
 358         return result;
 359     }
 360 };
 361 
 362 class  CashContext
 363 {
 364 private:
 365     CashSuper *cs;
 366 public:
 367     CashContext(string str)
 368     {
 369         if ("正常收费" == str)
 370         {
 371             cs = new CashNormal();
 372         }
 373         else if ("打9折" == str)
 374         {
 375             cs = new CashRebate(0.9);
 376         }
 377         else if ("满300送200" == str)
 378         {
 379             cs = new CashReturn(300, 200);
 380         }        
 381     }
 382     double getResult(double money)
 383     {
 384         return cs->acceptMoney(money);
 385     }
 386 };
 387 
 388 
 389 int main()
 390 {
 391     double money = 1000;
 392     CashContext *cc = new CashContext("打9折");
 393     cout << cc->getResult(money);
 394     return 0;
 395 }
 396 
 397 
 398 #include <string>
 399 #include <iostream>
 400 using namespace std;
 401 
 402 class Person
 403 {
 404 private:
 405     string m_strName;
 406 public:
 407     Person(string strName)
 408     {
 409         m_strName = strName;
 410     }
 411 
 412     Person(){}
 413 
 414     virtual void show()
 415     {
 416         cout << "装扮的是:" << m_strName << endl;
 417     }
 418 };    
 419 
 420 class Finery : public Person
 421 {
 422 protected:
 423     Person *m_component;
 424 public:
 425     void decorate(Person* component)
 426     {
 427         m_component = component;
 428     }
 429     virtual void show()
 430     {
 431         m_component->show();
 432     }
 433 };
 434 
 435 class TShirts : public Finery
 436 {
 437 public:
 438     virtual void show()
 439     {
 440         m_component->show();
 441         cout << "T shirts" << endl;
 442     }
 443 };
 444 
 445 class BigTrouser : public Finery
 446 {
 447 public:
 448     virtual void show()
 449     {
 450         m_component->show();
 451         cout << "Big Trouser" << endl;
 452     }
 453 };
 454 
 455 int main()
 456 {
 457     Person *p = new Person("小李");
 458     BigTrouser *bt = new BigTrouser();
 459     TShirts *ts = new TShirts();
 460         
 461     bt->decorate(p);
 462     ts->decorate(bt);
 463     ts->show();
 464 
 465     return 0;
 466 }
 467 
 468 #include <iostream>
 469 #include <string>
 470 using namespace std;
 471 
 472 class SchoolGirl
 473 {
 474 public:
 475     string name;
 476 };
 477 
 478 /*
 479  * 接口
 480  */
 481 class IGiveGift
 482 {
 483 public:
 484     virtual void giveDolls() = 0;
 485     virtual void giveFlowers() = 0;
 486 };
 487 
 488 /*
 489  * 委托类
 490  */
 491 class Pursuit : public IGiveGift
 492 {
 493 private:
 494     SchoolGirl mm;
 495 
 496 public:
 497     Pursuit(SchoolGirl m)
 498     {
 499         mm = m;
 500     }
 501     void giveDolls()
 502     {
 503         cout << mm.name << " 送你娃娃" << endl;    
 504     }
 505     void giveFlowers()
 506     {
 507         cout << mm.name << " 送你鲜花" << endl;    
 508     }
 509 };
 510 
 511 /*
 512  * 代理类
 513  */
 514 class Proxy : public IGiveGift
 515 {
 516 private:
 517     Pursuit gg;
 518 
 519 public:
 520     Proxy(SchoolGirl mm) : gg(mm)
 521     {
 522     }
 523     void giveDolls()
 524     {
 525         gg.giveDolls();
 526     }
 527     void giveFlowers()
 528     {
 529         gg.giveFlowers();
 530     }
 531 };
 532 
 533 /*
 534  * 客户端
 535  */
 536 int main()
 537 {
 538     SchoolGirl lijiaojiao;
 539     lijiaojiao.name = "李娇娇"; 
 540     Pursuit zhuojiayi(lijiaojiao); 
 541     Proxy daili(lijiaojiao);
 542 
 543     daili.giveDolls();
 544     daili.giveFlowers();
 545 
 546     return 0;
 547 }
 548 
 549 #include <iostream>
 550 #include <string>
 551 using namespace std;
 552 
 553 class Operation
 554 {
 555 public:
 556     double numberA;
 557     double numberB;
 558 
 559     virtual double getResult()
 560     {
 561         return 0;
 562     }
 563 };
 564 
 565 class addOperation : public Operation
 566 {
 567     double getResult()
 568     {
 569         return numberA + numberB;
 570     }
 571 };
 572 
 573  
 574 class subOperation : public Operation
 575 {
 576     double getResult()
 577     {
 578         return numberA - numberB;
 579     }
 580 };
 581 
 582 class mulOperation : public Operation
 583 {
 584     double getResult()
 585     {
 586         return numberA * numberB;
 587     }
 588 };
 589 
 590 class divOperation : public Operation
 591 {
 592     double getResult()
 593     {
 594         return numberA / numberB;
 595     }
 596 };
 597 
 598 class IFactory
 599 {
 600 public:
 601     virtual Operation *createOperation() = 0;
 602 };
 603 
 604 class AddFactory : public IFactory
 605 {
 606 public:
 607     static Operation *createOperation()
 608     {
 609         return new addOperation();
 610     }
 611 };
 612 
 613 
 614 class SubFactory : public IFactory
 615 {
 616 public:
 617     static Operation *createOperation()
 618     {
 619         return new subOperation();
 620     }
 621 };
 622 
 623 class MulFactory : public IFactory
 624 {
 625 public:
 626     static Operation *createOperation()
 627     {
 628         return new mulOperation();
 629     }
 630 };
 631 
 632 class DivFactory : public IFactory
 633 {
 634 public:
 635     static Operation *createOperation()
 636     {
 637         return new divOperation();
 638     }
 639 };
 640 
 641 int main()
 642 {
 643     Operation *oper = MulFactory::createOperation();
 644     oper->numberA = 9;
 645     oper->numberB = 99;
 646     cout << oper->getResult() << endl;
 647     return 0;
 648 }
 649 
 650 #include <iostream>
 651 #include <string>
 652 using namespace std;
 653 
 654 class Prototype
 655 {
 656 private:
 657     string str;
 658 public:
 659     Prototype(string s)
 660     {
 661         str = s;
 662     }
 663     Prototype()
 664     {
 665         str = "";
 666     }
 667     void show()
 668     {
 669         cout << str << endl;
 670     }
 671     virtual Prototype *clone() = 0;
 672 };
 673 
 674 class ConcretePrototype1 : public Prototype
 675 {
 676 public:
 677     ConcretePrototype1(string s) : Prototype(s)
 678     {}
 679     ConcretePrototype1(){}
 680     virtual Prototype *clone()
 681     {
 682         ConcretePrototype1 *p = new ConcretePrototype1();
 683         *p = *this;
 684         return p;
 685     }
 686 };
 687 
 688 
 689 class ConcretePrototype2 : public Prototype
 690 {
 691 public:
 692     ConcretePrototype2(string s) : Prototype(s)
 693     {}
 694     ConcretePrototype2(){}
 695     virtual Prototype *clone()
 696     {
 697         ConcretePrototype2 *p = new ConcretePrototype2();
 698         *p = *this;
 699         return p;
 700     }
 701 };
 702 
 703 int main()
 704 {
 705     ConcretePrototype1 *test = new ConcretePrototype1("小李");
 706     ConcretePrototype2 *test2 = (ConcretePrototype2 *)test->clone();
 707     test->show();
 708     test2->show();
 709     return 0;
 710 }
 711 
 712 #include <iostream>
 713 #include <string>
 714 using namespace std;
 715  
 716 class Resume
 717 {
 718 private:
 719     string name, sex, age, timeArea, company;
 720 public:
 721     Resume(string s)
 722     {
 723         name = s;
 724     }
 725     void setPersonalInfo(string s, string a)
 726     {
 727         sex = s;
 728         age = a;
 729     }
 730     void setWorkExperience(string t, string c)
 731     {
 732         timeArea = t;
 733         company = c;
 734     }
 735     void display()
 736     {
 737         cout << name << "  " << sex << "  " << age << endl;
 738         cout << "工作经历:  " << timeArea << "  " << company << endl;
 739 
 740     }
 741     Resume *clone()
 742     {
 743         Resume *b = new Resume(name);
 744         b->setPersonalInfo(sex, age);
 745         b->setWorkExperience(timeArea, company);
 746         return b;
 747     }
 748 };
 749 
 750 
 751 int main()
 752 {
 753     Resume *r = new Resume("李俊宏");      
 754     r->setPersonalInfo("","26");
 755     r->setWorkExperience("2007-2010","读研究生");
 756     r->display();
 757     
 758 
 759     Resume *r2 = r->clone();
 760     r2->setWorkExperience("2003-2007","读本科");
 761     
 762     r->display();
 763     r2->display();
 764     
 765     return 0;
 766 }
 767 
 768 #include <iostream>
 769 #include <string>
 770 using namespace std;
 771 
 772 class TestPaper
 773 {
 774 public:
 775     void question1()
 776     {
 777         cout << "1+1=" << answer1() << endl;
 778     }
 779     void question2()
 780     {
 781         cout << "1*1=" << answer2() << endl;
 782     }
 783     virtual string answer1()
 784     {
 785         return "";
 786     }
 787     virtual string answer2()
 788     {
 789         return "";
 790     }
 791     virtual ~TestPaper()
 792     {
 793     }
 794 };
 795 
 796 class TestPaperA : public TestPaper
 797 {
 798 public:
 799     string answer1()
 800     {
 801         return "2";
 802     }
 803     virtual string answer2()
 804     {
 805         return "1";
 806     }
 807 };
 808 
 809 class TestPaperB : public TestPaper
 810 {
 811 public:
 812     string answer1()
 813     {
 814         return "3";
 815     }
 816     virtual string answer2()
 817     {
 818         return "4";
 819     }
 820 };
 821 
 822 
 823 int main()
 824 {
 825     cout << "A的试卷:" << endl;
 826     TestPaper *s1 = new TestPaperA();
 827     s1->question1();
 828     s1->question2();
 829     delete s1;
 830 
 831     cout << endl;
 832     cout << "B的试卷:" << endl;
 833     TestPaper *s2 = new TestPaperB();
 834     s2->question1();
 835     s2->question2();
 836 
 837     return 0;
 838 }
 839 
 840 #include<iostream>
 841 #include <vector>
 842 #include <string>
 843 using namespace std;
 844 
 845 class AbstractClass
 846 {
 847 public:
 848     void Show()
 849     {
 850         cout << "我是" << GetName() << endl;
 851     }
 852 protected:
 853     virtual string GetName() = 0;
 854 };
 855 
 856 class Naruto : public AbstractClass
 857 {
 858 protected:
 859     virtual string GetName()
 860     {
 861         return "火影史上最帅的六代目---一鸣惊人naruto";
 862     }
 863 };
 864 
 865 class OnePice : public AbstractClass
 866 {
 867 protected:
 868     virtual string GetName()
 869     {
 870         return "我是无恶不做的大海贼---路飞";
 871     }
 872 };
 873 
 874 //客户端
 875 int main()
 876 {
 877     Naruto* man = new Naruto();
 878     man->Show();
 879 
 880     OnePice* man2 = new OnePice();
 881     man2->Show();
 882 
 883     return 0;
 884 }
 885 
 886 #include <iostream>
 887 #include <string>
 888 using namespace std;
 889 
 890 class Sub1
 891 {
 892 public:
 893     void f1()
 894     {
 895         cout << "子系统的方法 1" << endl;
 896     }
 897 };
 898 
 899 class Sub2
 900 {
 901 public:
 902     void f2()
 903     {
 904         cout << "子系统的方法 2" << endl;
 905     }
 906 };
 907 
 908 class Sub3
 909 {
 910 public:
 911     void f3()
 912     {
 913         cout << "子系统的方法 3" << endl;
 914     }
 915 };
 916 
 917 class Facade
 918 {
 919 private:
 920     Sub1 *s1;
 921     Sub2 *s2;
 922     Sub3 *s3;
 923 public:
 924     Facade()
 925     {
 926         s1 = new Sub1();
 927         s2 = new Sub2();
 928         s3 = new Sub3();
 929     }
 930 
 931     void method()
 932     {
 933         s1->f1();
 934         s2->f2();
 935         s3->f3();
 936     }
 937 
 938     ~Facade()
 939     {
 940         if (s1)
 941             delete s1;
 942         if (s2)
 943             delete s2;
 944         if (s3)
 945             delete s3;
 946     }
 947 };
 948 
 949 int main()
 950 {
 951     Facade *f = new Facade();
 952     f->method();
 953     return 0;
 954 }
 955 
 956 #include <string>
 957 #include <iostream>
 958 #include <vector>
 959 using namespace std;
 960 
 961 class Person
 962 {
 963 public:
 964     virtual void createHead() = 0;
 965     virtual void createHand() = 0;
 966     virtual void createBody() = 0;
 967     virtual void createFoot() = 0;
 968 };
 969 
 970 class ThinPerson : public Person
 971 {
 972     void createHead()
 973     {
 974         cout << "thin head" << endl;
 975     }
 976     void createHand()
 977     {
 978         cout << "thin hand" << endl;
 979     }
 980     void createBody()
 981     {
 982         cout << "thin body" << endl;
 983     }
 984     void createFoot()
 985     {
 986         cout << "thin foot" << endl;
 987     }
 988 };
 989 
 990 class FatPerson : public Person
 991 {
 992     void createHead()
 993     {
 994         cout << "fat head" << endl;
 995     }
 996     void createHand()
 997     {
 998         cout << "fat hand" << endl;
 999     }
1000     void createBody()
1001     {
1002         cout << "fat body" << endl;
1003     }
1004     void createFoot()
1005     {
1006         cout << "fat foot" << endl;
1007     }
1008 };
1009 
1010 
1011 class Director
1012 {
1013 private:
1014     Person *p;
1015 public:
1016     Director(Person *temp)
1017     {
1018         p = temp;
1019     }
1020     void create()
1021     {
1022         p->createHead();
1023         p->createHand();
1024         p->createBody();
1025         p->createFoot();
1026     }
1027 };
1028 
1029 //客户端代码:
1030 int main()
1031 {
1032     Person *p = new FatPerson();
1033     Person *b = new ThinPerson();
1034     Director *d = new Director(p);
1035     Director *s = new Director(b);
1036     d->create();
1037     s->create();
1038     delete d;
1039     delete p;
1040     delete s;
1041     delete b;
1042 
1043     return 0;
1044 }
1045 
1046 #include <string>
1047 #include <iostream>
1048 #include <vector>
1049 using namespace std;
1050 
1051 class Product
1052 {
1053 private:
1054     vector<string> product;
1055 public:
1056     void add(string str)
1057     {
1058         product.push_back(str);
1059     }
1060     void show()
1061     {
1062         vector<string>::iterator iter = product.begin();
1063         while (iter != product.end())
1064         {
1065             cout << *iter << "  ";
1066             ++iter;
1067         }
1068         cout << endl;
1069     }
1070 };
1071 
1072 class Builder
1073 {
1074 public:
1075     virtual void builderA() = 0;
1076     virtual void builderB() = 0;
1077     virtual Product *getResult() = 0;
1078 };
1079 
1080 class ConcreteBuilder1 : public Builder
1081 {
1082 private:
1083     Product *product;
1084 public:
1085     ConcreteBuilder1()
1086     {
1087         product = new Product();
1088     }
1089     virtual void builderA()
1090     {
1091         product->add("one");
1092     }
1093     virtual void builderB()
1094     {
1095         product->add("two");
1096     }
1097     virtual Product *getResult()
1098     {
1099         return product;
1100     }
1101 };
1102 
1103 
1104 class ConcreteBuilder2 : public Builder
1105 {
1106 private:
1107     Product *product;
1108 public:
1109     ConcreteBuilder2()
1110     {
1111         product = new Product();
1112     }
1113     virtual void builderA()
1114     {
1115         product->add("A");
1116     }
1117     virtual void builderB()
1118     {
1119         product->add("B");
1120     }
1121     virtual Product *getResult()
1122     {
1123         return product;
1124     }
1125 };
1126 
1127 class Director
1128 {
1129 private:
1130     Product *p;
1131 public:
1132     void construct(Builder *bd)
1133     {
1134         bd->builderA();
1135         bd->builderB();
1136         p = bd->getResult();
1137     }
1138     Product *getResult()
1139     {
1140         return p;
1141     }
1142 };
1143 
1144 int main()
1145 {
1146     Director *director = new Director();
1147 
1148     Builder *bd1 = new ConcreteBuilder1();
1149     director->construct(bd1);
1150     Product *pbd1 = director->getResult();
1151 
1152     pbd1->show();
1153 
1154     return 0;
1155 }
1156 
1157 // 观察者模式
1158 
1159 #include <iostream>
1160 #include <string>
1161 #include <list>
1162 using namespace std;
1163 
1164 class Observer;
1165 
1166 class Subject
1167 {
1168 protected:
1169     list<Observer*> observers;
1170 public:
1171     string action;
1172 public:
1173     virtual void attach(Observer*) = 0;
1174     virtual void detach(Observer*) = 0;
1175     virtual void notify() = 0;
1176 };
1177 
1178 class Observer
1179 {
1180 protected:
1181     string name;
1182     Subject *sub;
1183 public:
1184     Observer(string name, Subject *sub)
1185     {
1186         this->name = name;
1187         this->sub = sub;
1188     }
1189     string getName()
1190     {
1191         return name;
1192     }
1193     virtual void update() = 0;
1194 };
1195 
1196 class StockObserver : public Observer
1197 {
1198 public:
1199     StockObserver(string name, Subject *sub) : Observer(name, sub)
1200     {
1201     }
1202     void update();
1203 };
1204 
1205 void StockObserver::update()
1206 {
1207     cout << name << " 收到消息:" << sub->action << endl;
1208     if (sub->action == "梁所长来了!")
1209     {
1210         cout << "我马上关闭股票,装做很认真工作的样子!" << endl;
1211     }
1212 }
1213 
1214 class NBAObserver : public Observer
1215 {
1216 public:
1217     NBAObserver(string name, Subject *sub) : Observer(name, sub)
1218     {
1219     }
1220     void update();
1221 };
1222 
1223 void NBAObserver::update()
1224 {
1225     cout << name << " 收到消息:" << sub->action << endl;
1226     if (sub->action == "梁所长来了!")
1227     {
1228         cout << "我马上关闭NBA,装做很认真工作的样子!" << endl;
1229     }
1230 }
1231 
1232 class Secretary : public Subject
1233 {
1234     void attach(Observer *observer)
1235     {
1236         observers.push_back(observer);
1237     }
1238     void detach(Observer *observer)
1239     {
1240         list<Observer *>::iterator iter = observers.begin();
1241         while (iter != observers.end())
1242         {
1243             if ((*iter) == observer)
1244             {
1245                 cout << "erase:" << observer->getName() << endl;
1246                 observers.erase(iter++);
1247             }
1248             else
1249             {
1250                 ++iter;
1251             }
1252         }
1253     }
1254     void notify()
1255     {
1256         list<Observer *>::iterator iter = observers.begin();
1257         while (iter != observers.end())
1258         {
1259             (*iter)->update();
1260             ++iter;
1261         }
1262     }
1263 };
1264 
1265 
1266 int main()
1267 {
1268     Subject *dwq = new Secretary();
1269 
1270     Observer *xs = new NBAObserver("xiaoshuai", dwq);
1271     Observer *zy = new NBAObserver("zouyue", dwq);
1272     Observer *lm = new StockObserver("limin", dwq);
1273 
1274     dwq->attach(xs);
1275     dwq->attach(zy);
1276     dwq->attach(lm);
1277 
1278     dwq->action = "去吃饭了!";
1279     dwq->notify();
1280     cout << endl;
1281 
1282     dwq->action = "梁所长来了!";
1283     dwq->notify();
1284 
1285     dwq->detach(lm);
1286     dwq->detach(zy);
1287     dwq->detach(xs);
1288 
1289     return 0;
1290 }
1291 
1292 #include <iostream>
1293 #include <string>
1294 using namespace std;
1295 
1296 class IUser
1297 {
1298 public:
1299     virtual void getUser() = 0;
1300     virtual void setUser() = 0;
1301 };
1302 
1303 class SqlUser : public IUser
1304 {
1305 public:
1306     void getUser()
1307     {
1308         cout << "在sql中返回user" << endl;
1309     }
1310     void setUser()
1311     {
1312         cout << "在sql中设置user" << endl;
1313     }
1314 };
1315 
1316 class AccessUser : public IUser
1317 {
1318 public:
1319     void getUser()
1320     {
1321         cout << "在Access中返回user" << endl;
1322     }
1323     void setUser()
1324     {
1325         cout << "在Access中设置user" << endl;
1326     }
1327 };
1328 
1329 class IDepartment
1330 {
1331 public:
1332     virtual void getDepartment() = 0;
1333     virtual void setDepartment() = 0;
1334 };
1335 
1336 class SqlDepartment : public IDepartment
1337 {
1338 public:
1339     void getDepartment()
1340     {
1341         cout << "在sql中返回Department" << endl;
1342     }
1343     void setDepartment()
1344     {
1345         cout << "在sql中设置Department" << endl;
1346     }
1347 };
1348 
1349 class AccessDepartment : public IDepartment
1350 {
1351 public:
1352     void getDepartment()
1353     {
1354         cout << "在Access中返回Department" << endl;
1355     }
1356     void setDepartment()
1357     {
1358         cout << "在Access中设置Department" << endl;
1359     }
1360 };
1361 
1362 class IFactory
1363 {
1364 public:
1365     virtual IUser *createUser() = 0;
1366     virtual IDepartment *createDepartment() = 0;
1367 };
1368 
1369 class SqlFactory : public IFactory
1370 {
1371 public:
1372     IUser *createUser() 
1373     {
1374         return new SqlUser();
1375     }
1376     IDepartment *createDepartment() 
1377     {
1378         return new SqlDepartment();
1379     }
1380 };
1381 
1382 class AccessFactory : public IFactory
1383 {
1384 public:
1385     IUser *createUser()
1386     {
1387         return new AccessUser();
1388     }
1389     IDepartment *createDepartment() 
1390     {
1391         return new AccessDepartment();
1392     }
1393 };
1394 
1395 /*************************************************************/
1396 
1397 class DataAccess
1398 {
1399 private:
1400     static string db;
1401 public:
1402     static IUser *createUser()
1403     {
1404         if (db == "access")
1405         {
1406             return new AccessUser();
1407         }
1408         else if (db == "sql")
1409         {
1410             return new SqlUser();
1411         }
1412     }
1413     static IDepartment *createDepartment()
1414     {
1415         if (db == "access")
1416         {
1417             return new AccessDepartment();
1418         }
1419         else if (db == "sql")
1420         {
1421             return new SqlDepartment();
1422         }    
1423     }
1424 };
1425 
1426 string DataAccess::db = "sql";
1427 
1428 /*************************************************************/
1429 
1430 int main()
1431 {
1432     IFactory *factory;
1433     IUser *user;
1434     IDepartment *department;
1435 
1436     factory = new AccessFactory();
1437     user = factory->createUser();
1438     department = factory->createDepartment();
1439     
1440     user->getUser();
1441     user->setUser();
1442     department->getDepartment();
1443     department->setDepartment();
1444 
1445     user = DataAccess::createUser();
1446     department = DataAccess::createDepartment();
1447 
1448     user->getUser();
1449     user->setUser();
1450     department->getDepartment();
1451     department->setDepartment();
1452 
1453     return 0;
1454 }
1455 
1456 #include <iostream>
1457 #include <string>
1458 using namespace std;
1459 
1460 class Work;
1461 class State;
1462 class ForenonnState;
1463 
1464 
1465 class State
1466 {
1467 public:
1468     virtual void writeProgram(Work*) = 0;
1469 };
1470 
1471 class Work
1472 {
1473 public:
1474     int hour;
1475     State *current;
1476     Work();
1477     void writeProgram()
1478     {
1479         current->writeProgram(this);
1480     }
1481 };
1482 
1483 class EveningState : public State
1484 {
1485 public:
1486     void writeProgram(Work *w)
1487     {
1488         cout << "当前时间: " << w->hour << "心情很好,在看《明朝那些事儿》,收获很大!" << endl;
1489     }
1490 };
1491 
1492 class AfternoonState : public State
1493 {
1494 public:
1495     void writeProgram(Work *w)
1496     {
1497         if (w->hour < 19)
1498         {
1499             cout << "当前时间: " << w->hour << "下午午睡后,工作还是精神百倍!" << endl;
1500         }
1501         else
1502         {
1503             w->current = new EveningState();
1504             w->writeProgram();
1505         }
1506     }
1507 };
1508 
1509 class ForenonnState : public State
1510 {
1511 public:
1512     void writeProgram(Work *w)
1513     {
1514         if (w->hour < 12)
1515         {
1516             cout << "当前时间: " << w->hour << "上午工作精神百倍!" << endl;
1517         }
1518         else
1519         {
1520             w->current = new AfternoonState();
1521             w->writeProgram();
1522         }
1523     }
1524 };
1525 
1526 Work::Work()
1527 {
1528     current = new ForenonnState();
1529 }
1530 
1531 int main()
1532 {
1533     Work *w = new Work();
1534     w->hour = 21;
1535     w->writeProgram();
1536     return 0;
1537 }
1538 //Reuslt:
1539 //当前时间: 21心情很好,在看《明朝那些事儿》,收获很大!
1540 
1541 #include <iostream>
1542 #include <string>
1543 using namespace std;
1544 
1545 class Adaptee
1546 {
1547 public:
1548     virtual void myRequest()
1549     {
1550         cout << "实际上的接口" << endl;
1551     }
1552 };
1553 
1554 class Target
1555 {
1556 public:
1557     virtual void request() = 0;
1558     virtual ~Target(){}
1559 };
1560 
1561 class Adapter : public Target
1562 {
1563 private:
1564     Adaptee adaptee;
1565 public:
1566     void request()
1567     {
1568         adaptee.myRequest();
1569     }
1570 };
1571 
1572 int main()
1573 {
1574     Target *target = new Adapter();
1575     target->request();
1576     delete target;
1577     return 0;
1578 }
1579 //Result:
1580 //实际上的接口
1581 
1582 #include <iostream>
1583 #include <string>
1584 using namespace std;
1585 
1586 class Player
1587 {
1588 public:
1589     string name;
1590     Player(string name)
1591     {
1592         this->name = name;
1593     }
1594     virtual void attack() = 0;
1595     virtual void defence() = 0;
1596 }; 
1597 
1598 class Forwards : public Player
1599 {
1600 public:
1601     Forwards(string name) : Player(name){}
1602     void attack()
1603     {
1604         cout << name << "前锋进攻" << endl;
1605     }
1606     void defence()
1607     {
1608         cout << name << "前锋防守" << endl;
1609     }
1610 };
1611 
1612 class Center : public Player
1613 {
1614 public:
1615     Center(string name) : Player(name){}
1616     void attack()
1617     {
1618         cout << name << "中锋进攻" << endl;
1619     }
1620     void defence()
1621     {
1622         cout << name << "中锋防守" << endl;
1623     }
1624 };
1625 
1626 class Backwards : public Player
1627 {
1628 public:
1629     Backwards(string name) : Player(name){}
1630     void attack()
1631     {
1632         cout << name << "后卫进攻" << endl;
1633     }
1634     void defence()
1635     {
1636         cout << name << "后卫防守" << endl;
1637     }
1638 };
1639 /*****************************************************************/
1640 class ForeignCenter
1641 {
1642 public:
1643     string name;
1644     ForeignCenter(string name)
1645     {
1646         this->name = name;
1647     }
1648     void myAttack()
1649     {
1650         cout << name << "外籍中锋进攻" << endl;
1651     }
1652     void myDefence()
1653     {
1654         cout << name << "外籍中锋防守" << endl;
1655     }
1656 };
1657 /*****************************************************************/
1658 class Translator : public Player
1659 {
1660 private:
1661     ForeignCenter *fc;
1662 public:
1663     Translator(string name) : Player(name)
1664     {
1665         fc = new ForeignCenter(name); 
1666     }
1667     void attack()
1668     {
1669         fc->myAttack();
1670     }
1671     void defence()
1672     {
1673         fc->myDefence();
1674     }
1675 };
1676 /*****************************************************************/
1677 int main()
1678 {
1679     Player *p1 = new Center("李俊宏");
1680     p1->attack();
1681     p1->defence();
1682     
1683     Translator *tl = new Translator("姚明");
1684     tl->attack();
1685     tl->defence();
1686     
1687     return 0;
1688 }
1689 //Result:
1690 /*
1691 李俊宏中锋进攻
1692 李俊宏中锋防守
1693 姚明外籍中锋进攻
1694 姚明外籍中锋防守
1695 */
1696 
1697 
1698 #include <iostream>
1699 #include <string>
1700 #include <vector>
1701 using namespace std;
1702 
1703 class Memo
1704 {
1705 public:
1706     string state;
1707     Memo(string state)
1708     {
1709         this->state = state;
1710     }
1711 };
1712 
1713 class Originator
1714 {
1715 public:
1716     string state;
1717     void setMemo(Memo *memo)
1718     {
1719         state = memo->state;
1720     }
1721     Memo *createMemo()
1722     {
1723         return new Memo(state);
1724     }
1725     void show()
1726     {
1727         cout << state << endl;
1728     }
1729 };    
1730 
1731 class Caretaker
1732 {
1733 public:
1734     vector<Memo *> memo;
1735 public:
1736     void save(Memo *memo)
1737     {
1738         (this->memo).push_back(memo);
1739     }
1740     Memo *getState(int i)
1741     {
1742         return memo[i];
1743     }
1744 };
1745  
1746 int main()
1747 {
1748     Originator *og = new Originator();
1749     Caretaker *ct = new Caretaker(); 
1750 
1751     og->state = "on";
1752     og->show();    
1753     ct->save(og->createMemo());
1754 
1755     og->state = "off";
1756     og->show();
1757     ct->save(og->createMemo());
1758 
1759     og->state = "middle";
1760     og->show();
1761     ct->save(og->createMemo());
1762 
1763     og->setMemo( ct->getState(1) );
1764     og->show();
1765 
1766     return 0;
1767 }
1768 //Result:
1769 /*
1770 on
1771 off
1772 middle
1773 off
1774 */
1775 
1776 #include <iostream>
1777 #include <vector>
1778 #include <string>
1779 using namespace std;
1780 
1781 class Component
1782 {
1783 public:
1784     string name;
1785     Component(string name)
1786     {
1787         this->name = name;
1788     }
1789     virtual void add(Component *) = 0;
1790     virtual void remove(Component *) = 0;
1791     virtual void display(int) = 0;
1792 };
1793 
1794 class Leaf : public Component
1795 {
1796 public:
1797     Leaf(string name) : Component(name)
1798     {}
1799     void add(Component *c)
1800     {
1801         cout << "leaf cannot add" << endl;
1802     }
1803     void remove(Component *c)
1804     {
1805         cout << "leaf cannot remove" << endl;
1806     }
1807     void display(int depth)
1808     {
1809         string str(depth, -);
1810         str += name;
1811         cout << str << endl;
1812     }
1813 };
1814 
1815 class Composite : public Component
1816 {
1817 private:
1818     vector<Component*> component;
1819 public:
1820     Composite(string name) : Component(name)
1821     {}
1822     void add(Component *c)
1823     {
1824         component.push_back(c);
1825     }
1826     void remove(Component *c)
1827     {
1828         vector<Component*>::iterator iter = component.begin();
1829         while (iter != component.end())
1830         {
1831             if (*iter == c)
1832             {
1833                 component.erase(iter++);
1834             }
1835             else
1836             {
1837                 iter++;
1838             }
1839         }
1840     }
1841     void display(int depth)
1842     {
1843         string str(depth, -);
1844         str += name;
1845         cout << str << endl;
1846 
1847         vector<Component*>::iterator iter=component.begin();
1848         while (iter != component.end())
1849         {
1850             (*iter)->display(depth + 2);
1851             iter++;
1852         }
1853     }
1854 };
1855 
1856 
1857 int main()
1858 {
1859     Component *p = new Composite("小李"); 
1860     p->add(new Leaf("小王"));
1861     p->add(new Leaf("小强"));
1862 
1863     Component *sub = new Composite("小虎"); 
1864     sub->add(new Leaf("小王"));
1865     sub->add(new Leaf("小明"));
1866     sub->add(new Leaf("小柳"));
1867     
1868     p->add(sub);
1869     p->display(0);
1870 
1871     cout << "*******" << endl;
1872     sub->display(2);
1873 
1874     return 0;
1875 }
1876 //Result:
1877 /*
1878 小李
1879 --小王
1880 --小强
1881 --小虎
1882 ----小王
1883 ----小明
1884 ----小柳
1885 *******
1886 --小虎
1887 ----小王
1888 ----小明
1889 ----小柳
1890 */
1891 
1892 #include <iostream>
1893 #include <string>
1894 using namespace std;
1895 
1896 class Iterator;
1897 
1898 class Aggregate
1899 {
1900 public:
1901     virtual Iterator *createIterator() = 0;
1902 };
1903 
1904 class Iterator
1905 {
1906 public:
1907     virtual void first() = 0;
1908     virtual void next() = 0;
1909     virtual bool isDone() = 0;
1910 };
1911 
1912 class ConcreteAggregate : public Iterator
1913 {
1914 public:
1915     void first()
1916     {}
1917     void next()
1918     {}
1919     bool isDone()
1920     {}
1921 };
1922 
1923 int main()
1924 {
1925     return 0;
1926 }
1927 
1928 #include <iostream>
1929 #include <string>
1930 using namespace std;
1931 
1932 class Singleton
1933 {    
1934 private:
1935     int i;
1936     static Singleton *instance;
1937     Singleton(int i)
1938     {
1939         this->i = i;
1940     }
1941 public:
1942     static Singleton *getInstance()
1943     {
1944         return instance;
1945     }
1946     void show()
1947     { 
1948         cout << i << endl;
1949     }
1950 };
1951 
1952 Singleton* Singleton::instance = new Singleton(8899); 
1953 
1954 class A : public Singleton
1955 {
1956 
1957 };
1958 
1959 int main()
1960 {
1961     Singleton *s = Singleton::getInstance();
1962     Singleton *s2 = A::getInstance();
1963     cout << s << endl;
1964     cout << s2 << endl;
1965     cout << (s == s2) << endl;
1966     return 0;
1967 }
1968 
1969 #include <iostream>
1970 #include <string>
1971 using namespace std;
1972 
1973 class HandsetSoft
1974 {
1975 public:
1976     virtual void run() = 0;
1977 };
1978 
1979 class HandsetGame : public HandsetSoft
1980 {
1981 public:
1982     void run()
1983     {
1984         cout << "运行手机游戏" << endl;
1985     }
1986 };
1987 
1988 class HandsetAddressList : public HandsetSoft
1989 {
1990 public:
1991     void run()
1992     {
1993         cout << "运行手机通讯录" << endl;
1994     }
1995 };
1996 
1997 class HandsetBrand
1998 {
1999 protected:
2000     HandsetSoft *soft;
2001 public:
2002     void setHandsetSoft(HandsetSoft *soft)
2003     {
2004         this->soft = soft;
2005     }
2006     virtual void run() = 0;
2007 };
2008 
2009 class HandsetBrandN : public HandsetBrand
2010 {
2011 public:
2012     void run()
2013     {
2014         soft->run();
2015     }
2016 };
2017 
2018 class HandsetBrandM : public HandsetBrand
2019 {
2020 public:
2021     void run()
2022     {
2023         soft->run();
2024     }
2025 };
2026 
2027 int main()
2028 {
2029     HandsetBrand *hb;
2030     hb = new HandsetBrandM();
2031     
2032     hb->setHandsetSoft(new HandsetGame());
2033     hb->run();
2034     hb->setHandsetSoft(new HandsetAddressList());
2035     hb->run();
2036 
2037     return 0;
2038 }
2039 #endif
2040 
2041 #include <iostream>
2042 #include <string>
2043 #include <list>
2044 
2045 using namespace std;
2046 
2047 class Barbecuer
2048 {
2049 public:
2050     void bakeMutton()
2051     {
2052         cout << "烤羊肉串" << endl;
2053     }
2054     void bakeChickenWing()
2055     {
2056         cout << "烤鸡翅" << endl;
2057     }
2058 };
2059 
2060 class Command
2061 {
2062 protected:
2063     Barbecuer *receiver;
2064 public:
2065     Command(Barbecuer *receiver)
2066     {
2067         this->receiver = receiver;
2068     }
2069     virtual void executeCommand() = 0;
2070 };
2071 
2072 class BakeMuttonCommand : public Command
2073 {
2074 public:
2075     BakeMuttonCommand(Barbecuer *receiver) : Command(receiver)
2076     {}
2077     void executeCommand()
2078     {
2079         receiver->bakeMutton();
2080     }
2081 };
2082 
2083 class BakeChikenWingCommand : public Command
2084 {
2085 public:
2086     BakeChikenWingCommand(Barbecuer *receiver) : Command(receiver)
2087     {}
2088     void executeCommand()
2089     {
2090         receiver->bakeChickenWing();
2091     }
2092 };
2093 
2094 class Waiter
2095 {
2096 private:
2097     Command *command;
2098 public:
2099     void setOrder(Command *command)
2100     {
2101         this->command = command;
2102     }
2103     void notify()
2104     {
2105         command->executeCommand();
2106     }
2107 };
2108 
2109 class Waiter2
2110 {
2111 private:
2112     list<Command*> orders;
2113 public:
2114     void setOrder(Command *command)
2115     {
2116         orders.push_back(command);
2117     }
2118     void cancelOrder(Command *command) 
2119     {}
2120     void notify()
2121     {
2122         list<Command*>::iterator iter = orders.begin();
2123         while (iter != orders.end())
2124         {
2125             (*iter)->executeCommand();
2126             iter++;
2127         }
2128     }
2129 };
2130 
2131 
2132 int main()
2133 {
2134     Barbecuer *boy = new Barbecuer();
2135     Command *bm1 = new BakeMuttonCommand(boy);
2136     Command *bm2 = new BakeMuttonCommand(boy);
2137     Command *bc1 = new BakeChikenWingCommand(boy);
2138     
2139     cout << "Waiter2:" << endl;
2140     Waiter2 *girl2 = new Waiter2();
2141 
2142     girl2->setOrder(bm1);
2143      girl2->setOrder(bc1);
2144      girl2->setOrder(bm2);
2145     
2146     girl2->notify();
2147     
2148     cout << "Waiter:" << endl;
2149     Waiter *girl = new Waiter();
2150 
2151     girl->setOrder(bm1);
2152     girl->notify();
2153 
2154     girl->setOrder(bm2);
2155     girl->notify();
2156 
2157     girl->setOrder(bc1);
2158     girl->notify();
2159 
2160     return 0;
2161 }
2162 //Result:
2163 /*
2164 Waiter2:
2165 烤羊肉串
2166 烤鸡翅
2167 烤羊肉串
2168 Waiter:
2169 烤羊肉串
2170 烤羊肉串
2171 烤鸡翅
2172 */
View Code

 

Good   Good   Study,  Day   Day  Up.

顺序  选择  循环  总结

命令模式

标签:style   blog   http   color   os   io   ar   for   2014   

原文地址:http://www.cnblogs.com/Braveliu/p/3956683.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!