java设计模式 简书_Java设计模式——策略模式

简介

策略模式是属于行为模式的,在策略模式中,一个类的行为或算法可以在运行时更改。其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。

优点

算法可以自由切换

避免使用多重判断条件

扩展性良好

缺点

策略类会增多

所有策略类都需要对外暴露

使用场景

使用在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

一个系统需要动态地在几种算法中选择一种。

如果一个对象有很多的行为,如果不用恰当的模式,这些行为只好使用多重的条件选择语句来实现。

组成

抽象策略角色:是一个抽象的角色,通常情况下使用接口或者抽象类去实现。

具体策略角色:包装了具体的算法和行为。

环境角色:内部持有一个抽象角色的引用,给客户端调用。

UML类图

f75eeed0acad

image.png

实现步骤

1.定义一个抽象策略角色,为策略对象定义一个公共的接口

2.编写具体策略角色,实现上面的接口

3.定义环境角色,内部持有一个策略类的引用。

示例

小明去上学有很多种方式可以选择,例如有步行,私家车,自行车等方式,现在将这个例子来讲解策略模式。

定义一个抽象的接口Strategy,是一个抽象策略的角色。

/**

* 抽象策略者角色

*/

public interface Strategy {

void goToSchool();

}

2.定义各个的具体策略者。

/**

* 具体的策略者,实现抽象策略者的接口

*/

class WalkStrategy implements Strategy{

@Override

public void goToSchool() {

System.out.println("走路去上学。");

}

}

class BicycleStrategy implements Strategy{

@Override

public void goToSchool() {

System.out.println("骑自行车去上学。");

}

}

class CarStrategy implements Strategy{

@Override

public void goToSchool() {

System.out.println("搭车去上学。");

}

}

3.定义环境角色,通过聚合的方式与Strategy进行关联,编写提供给客户端调用的方法。

/**

* 环境角色,提供给客户进行调用

*/

public class Context {

private Strategy mStrategy;

public Context(Strategy strategy){

mStrategy=strategy;

}

/**

* 提供给客户端调用的方法

*/

public void goToSchoolMethod(){

mStrategy.goToSchool();

}

}

4.具体的使用

public class StrategyPattern {

public static void main(String[] args){

Context context1=new Context(new WalkStrategy());

context1.goToSchoolMethod();

Context context2=new Context(new BicycleStrategy());

context2.goToSchoolMethod();

Context context3=new Context(new CarStrategy());

context3.goToSchoolMethod();

}

}

输出结果:

走路去上学。

骑自行车去上学。

搭车去上学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值