策略模式
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通