Java设计模式01--策略模式

本文通过模拟鸭子游戏项目,探讨了如何使用策略模式解决类继承带来的问题。策略模式将可变的行为封装进不同的类中,使得算法可以独立于使用它们的类进行变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略者模式,是要解决某类常规思想设计容易带来问题的问题。

请看如下案例:


1、模拟鸭子项目   2、项目的新需求   3、用OO原则解决新需求的不足   4、用策略模式来新需求解决   5、重新设计模拟鸭子项目   6、总结策略模式定义    
策略模式原理  
1、从项目"模拟鸭子游戏"开始   2、从OO的角度设计这个项目,鸭子超类,扩展超类:   public abstract class Duck {

public void Quack() {


System.out.println("~~gaga~~");

}

public abstract void display();

public void swim() {


System.out.println("~~im swim~~");

}

}


模拟鸭子项目  
1、GreenHeadDuck继承Duck :   public class GreenHeadDuck extends Duck {

@Override

public void display() {


System.out.println("**GreenHead**");

}
}

2、同理可有RedHeadDuck等


模拟鸭子项目  
1、应对新的需求,看看这个设计的可扩展性   1)添加会飞的鸭子     2、OO思维里的继承方式解决方案是:   public abstract class Duck {


...;


public void Fly() {


System.out.println("~~im fly~~");

}

}; 问题来了,这个Fly让所有子类都会飞了,这是不科学的。   继承的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。影响会有溢出效应  


项目的新需求  
1、继续尝试用OO原理来解决,覆盖: 

  public class GreenHeadDuck extends Duck { ...; public void Fly()

 {   System.out.println("~~no fly~~");  }  } 

2、又有新需求,石头鸭子,填坑: 

  public class StoneDuck extends Duck { ....
}; 

超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式  
用OO原则解决新需求的不足  
需要新的设计方式,应对项目的扩展性,降低复杂度:

1)分析项目变化与不变部分,提取变化部分,抽象成接口+实现; 

 2)鸭子哪些功能是会根据新需求变化的?叫声、飞行...          
用策略模式来新需求解决  
1、接口:

1)

public interface FlyBehavior {

    void fly();

}


 2)

public interface QuackBehavior {

void quack();

};



  3)好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没 有挖坑        
用策略模式来新需求解决  
1、重新设计的鸭子项目: 

  public abstract class Duck {

    FlyBehavior mFlyBehavior;

   QuackBehavior mQuackBehavior;

public Duck() {
}

public void Fly() {


mFlyBehavior.fly();

}

public void Quack() {


mQuackBehavior.quack();

}

public abstract void display();

}
   重新设计模拟鸭子项目  
1、绿头鸭、石头鸭:   public class GreenHeadDuck extends Duck {  public GreenHeadDuck() {   mFlyBehavior = new GoodFlyBehavior();   mQuackBehavior = new GaGaQuackBehavior();  }  @Override  public void display() {...} } 2、策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设 定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为 算法的变化独立于算法的使用者。    






继承的问题:对类的局部改动,尤其是超类的局部改动,会影响其他部分,影响会有溢出效应:








理解一:策略(Strategy)模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。策略模式主要用来平滑地处理算法的切换。

理解二:策略模式分别封装行为接口,实现算法组,超类里面放行为接口对象,子类里面具体设定为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能,此模式让行为算法的变化,独立于算法的使用者。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值