策略模式(常用)
2023-12-14 17:44:37
策略模式的简介
????????在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。
????????策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。
策略模式的结构
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用
策略模式的优缺点
??优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好
??缺点:
- 策略类会增多。
- 所有策略类都需要对外暴露。
策略模式的使用场景
????????一个对象,其行为有些固定不变,有些又容易变化。对于这些容易变化的行为,我们不希望将其实现绑定在对象中,而希望能够动态地针对不同场景产生不同应对的策略。 这时就要用到策略模式,就是为了应对对象中复杂多变的行为而产生的:
- 系统有很多类,而他们的区别仅在于行为不同
- 一个系统需要动态地在几种算法中选择一种
直接代码理解
//抽象策略(Strategy)类
//创建购买汽车策略接口
public interface CarStrategy {
public void buyCar();
}
//具体策略(Concrete Strategy)类
//创建购买奔驰车类,实现CarStrategy接口。
public class BcCar implements CarStrategy {
@Override
public void buyCar() {
System.out.println("欢迎购买奔驰E300L。。。。。。");
}
}
//创建购买宝马车类,实现CarStrategy接口。
public class BmwCar implements CarStrategy {
@Override
public void buyCar() {
System.out.println("欢迎购买宝马530Li。。。。。。");
}
}
//创建购买奥迪车类,实现CarStrategy接口。
public class AudiCar implements CarStrategy {
@Override
public void buyCar() {
System.out.println("欢迎购买奥迪A6L。。。。。。");
}
}
//环境(Context)类
//创建汽车环境类。
public class CarContext {
private CarStrategy carStrategy;
public CarContext(CarStrategy carStrategy){
this.carStrategy = carStrategy;
}
public void buyCarStrategy(){
carStrategy.buyCar();
}
}
//Test
@Test
public void testStrategy(){
// 宝马车
CarContext bmwCarContext = new CarContext(new BmwCar());
bmwCarContext1.buyCarStrategy();
// 奔驰车
CarContext bcCarContext = new CarContext(new BcCar());
bcCarContext.buyCarStrategy();
// 奥迪车
CarContext audiCarContext = new CarContext(new AudiCar());
audiCarContext.buyCarStrategy();
}
我觉得这个模式比较好理解,也就是用来解决在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
文章来源:https://blog.csdn.net/qq_56751933/article/details/134826779
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!