策略模式
什么是策略模式, 简单的说: 一个问题有不同的解法;而作为client用怎么样的方式去选择的问题。
定义问题的各种算法,把每一个算法封装起来, 并且使它们可相互转换。
下面看个列子:
坐火车、坐高铁、坐飞机
总之,最终的目的地都是一样的。也就是选择不同的方式产生的结果都是一样的。
来我们念念八股文: 这个策略模式所需要的角色:
1、环境类(Context):用来操作策略的上下文环境,也就是我们游客。
2、抽象策略类(Strategy):策略的抽象,出行方式的抽象
3、具体策略类(ConcreteStrategy):具体的策略实现,每一种出行方式的具体实现。
来, 废话不多说, 献上你的节操:
第一:定义解决问题的抽象:
public interface Strategy{
void travelMethod();
}
第二步:具体解决问题的方法
// 火车
class TrainStrategy implements Strategy {
@Override
public void travelMethod() {
System.out.println("kuang dang!kuang dang!kuang dang!kuang dang!");
}
}
// 飞机
class AircraftStrategy implements Strategy {
@Override
public void travelMethod() {
System.out.println("jue !!!jue!!!");
}
}
// 大炮
class ArtilleryStrategy implements Strategy {
@Override
public void travelMethod() {
System.out.println("pong!pong!pong!pong!pong!");
}
}
第三步:环境构建
class travelerContext {
TrainStrategy trainStrategy;
public travelerContext(TrainStrategy trainStrategy) {
this.trainStrategy = trainStrategy;
}
public void travelMethod() {
this.trainStrategy.travelMethod();
}
}
public static void main(String[] args) {
// 先构建问题的上下文
travelerContext travelerContext = new travelerContext();
// 根据不同的类型的乘客选用不用的交通方式
// 穷屌丝:
Strategy trainStrategy = new TrainStrategy();
travelerContext.SetTravelerContext(trainStrategy);
travelerContext.travelMethod();
//小康生活的:
Strategy aircraftStrategy = new AircraftStrategy();
travelerContext.SetTravelerContext(aircraftStrategy);
travelerContext.travelMethod();
//有钱的: 当然是坐大炮了
ArtilleryStrategy artilleryStrategy = new ArtilleryStrategy();
travelerContext.SetTravelerContext(artilleryStrategy);
travelerContext.travelMethod();
// 你是哪一种呢、、、、
}
按照设计模式的基本原则大致就是这样, 注意, 在实际工作中, 不要因为设计模式而生搬硬套,这样往往得不偿失。
那么策略模式在实际业务场景中帮我们解决了什么问题, 是个coder都会说:让code beautiful 起来; 哈哈!也许你觉得我不专业:好, 那就上个专业名词: 开闭原则。
实际工作案列:
一个爬虫项目: 要爬取不同的网站, 最终解决的问题是不是一样的(构建url、 抓取数据), 此时是不是可以用上了呀!
根据不同的网站特点构建不同的上下文
,分发到不同的策略去执行。。。
当然: 我们还可以组合其它的设计模式组装code, 这样年轻、貌美、大长腿是不是出来了。。。
好了!今天分享到这里, 谢谢各位看客老爷们。。。