策略模式

1.使用场景:算法经常变化

2.基本思想:定义算法家族,分别封装起来,让它们之间可以互相替换,让算法的变化独立于算法的客户;

                    将行为委托给XXX代为处理      

3.应用技术:多态 ,多用组合少用继承

4.实现代码:

Java:

  1 //strategy java
  2 abstract class Duck{
  3 
  4     public Duck(){}
  5     
  6     public abstract void display();
  7     
  8     public void performFly(){
  9         flyBehavior.fly();            //delegate to fly
 10     }
 11     
 12     public void performQuack(){
 13         quackBehavior.quack();        //delegate to quack
 14     }
 15     
 16     public void swim(){
 17         System.out.println("All ducks can swim.");
 18     }
 19 
 20     FlyBehavior   flyBehavior;      //fly
 21     QuackBehavior quackBehavior;    //quack
 22 }
 23 
 24 //MallardDuck
 25 class MallardDuck extends Duck{
 26     public MallardDuck(){
 27         flyBehavior   = new FlyWithWings();
 28         quackBehavior = new Quack();
 29     }
 30     
 31     public MallardDuck(FlyBehavior fb,QuackBehavior qb){
 32         flyBehavior   = fb;
 33         quackBehavior = qb;
 34     }
 35     
 36     public void display(){
 37         System.out.println("I`m a real Mallard duck");
 38     }
 39 }
 40 
 41 //FlyBehavior
 42 interface FlyBehavior{
 43     public void fly();
 44 }
 45 
 46 class FlyWithWings implements FlyBehavior{
 47     public void fly(){
 48         System.out.println("I`m flying!");
 49     }
 50 }
 51 
 52 class FlyNoWay implements FlyBehavior{
 53     public void fly(){
 54         System.out.println("I can`t fly!");
 55     }
 56 }
 57 
 58 //quack
 59 interface QuackBehavior{
 60     public void quack();
 61 }
 62 
 63 class Quack implements QuackBehavior{
 64     public void quack(){
 65         System.out.println("Quack");
 66     }
 67 }
 68 
 69 class MuteQuack implements QuackBehavior{
 70     public void quack(){
 71         System.out.println("Silence");
 72     }
 73 }
 74 
 75 class Squack implements QuackBehavior{
 76     public void quack(){
 77         System.out.println("Squack");
 78     }
 79 }
 80 
 81 //main
 82 public class DuckSimulator{
 83     public static void main(String[] args){
 84         //1
 85         Duck mallard_1 = new MallardDuck();
 86         mallard_1.performFly();
 87         mallard_1.performQuack();
 88         mallard_1.display();
 89         mallard_1.swim();
 90                 
 91         //2
 92         FlyBehavior     fly = () -> System.out.println("\r\nflying...");
 93         QuackBehavior   quk = () -> System.out.println("quacking...");
 94         Duck mallard_2 = new MallardDuck(fly,quk);
 95         mallard_2.performFly();
 96         mallard_2.performQuack();
 97         
 98         //set fly
 99         mallard_2.flyBehavior = () -> System.out.println("\r\nstop flying...");
100         mallard_2.performFly();
101     }
102 }

 

 C++:

  1 //strategy c++
  2 #include <iostream>
  3 #include <memory>
  4 using namespace std;
  5 
  6 //FlyBehavior
  7 class FlyBehavior{
  8 public:
  9     virtual void fly() = 0;
 10 };
 11 
 12 class FlyWithWings : public FlyBehavior{
 13 public:
 14     void fly(){
 15         cout<<"I`m flying!"<<endl;
 16     }
 17 };
 18 
 19 class FlyNoWay : public FlyBehavior{
 20 public:
 21     void fly(){
 22         cout<<"I can`t fly!"<<endl;
 23     }
 24 };
 25 
 26 //quack
 27 class QuackBehavior{
 28 public:
 29     virtual void quack() = 0;
 30 };
 31 
 32 class Quack : public QuackBehavior{
 33 public:
 34     void quack(){
 35         cout<<"Quack"<<endl;
 36     }
 37 };
 38 
 39 class MuteQuack : public QuackBehavior{
 40 public:
 41     void quack(){
 42         cout<<"Silence"<<endl;
 43     }
 44 };
 45 
 46 //Duck
 47 class Duck{
 48 
 49 public:
 50     Duck(){};
 51     Duck(shared_ptr<FlyBehavior> pfb,shared_ptr<QuackBehavior> pqb) :
 52     m_pflyBehavior(pfb),
 53     m_pquackBehavior(pqb){};
 54 
 55     virtual void display() = 0;                             //pure virtual 不能实例化
 56     
 57     void setFlyBehavior(shared_ptr<FlyBehavior> pfb)        { m_pflyBehavior = pfb;  }
 58     void performFly()                                       { m_pflyBehavior->fly(); }
 59     
 60     void setQuackBehavior(shared_ptr<QuackBehavior> pqb)    { m_pquackBehavior = pqb;    }
 61     void performQuack()                                     { m_pquackBehavior->quack(); }
 62     
 63     void swim()                                             { cout<<"All ducks can swim."<<endl; }
 64     
 65 private:
 66     shared_ptr<FlyBehavior>   m_pflyBehavior;   //fly
 67     shared_ptr<QuackBehavior> m_pquackBehavior; //quack
 68 };
 69 
 70 class MallardDuck : public Duck{
 71 
 72 public:
 73     MallardDuck(){
 74         setFlyBehavior(make_shared<FlyWithWings>());
 75         setQuackBehavior(make_shared<Quack>());
 76     }
 77 
 78     MallardDuck(shared_ptr<FlyBehavior> fb,shared_ptr<QuackBehavior> pb) : Duck(fb,pb){}
 79 
 80     void display(){
 81         cout<<"I`m a real Mallard duck"<<endl;
 82     }
 83 };
 84 
 85 //main
 86 int main()
 87 {
 88     //mallard_1
 89     Duck* mallard_1 = new MallardDuck();
 90     mallard_1->performFly();
 91     mallard_1->performQuack();
 92     mallard_1->display();
 93     mallard_1->swim();
 94     
 95     //mallard_2
 96     cout<<"\r\nmallard_2:\r\n";
 97     auto fly = make_shared<FlyWithWings>();
 98     auto quk = make_shared<MuteQuack>();
 99     Duck* mallard_2 = new MallardDuck(fly,quk);
100     mallard_2->performFly();
101     mallard_2->performQuack();
102     
103     //set fly
104     [](){cout<<"\r\nset fly:\r\n";}();
105     mallard_2->setFlyBehavior(make_shared<FlyNoWay>());
106     mallard_2->performFly();
107 
108     return 0;
109 }

 

 

posted @ 2020-04-03 15:12  三岁玩童  阅读(132)  评论(0编辑  收藏  举报