定义:
定义了算法族,分别封装起来。让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
结构:
指导思想:
使用组合而不是继承
解决的问题:
在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
实现方式:
将可替换的算法抽象成一个接口,各个具体的算法实现它。在使用算法的类里面定义一个属性来保存算法接口。在真正使用算法的时候,委托给对应的具体算法进行操作。
举例:
对于煎饼摊来说,有做煎饼这种算法,但是可能会有山东煎饼,天津煎饼等不同的做法。此时就可以采取策略模式,把做煎饼这个算法封装出来,以后还可以扩展西式煎饼。
/**
* 抽象的做煎饼的接口
*/
public interface MakePancakeBehavior {
void makePancake();
}
/************************************/
/**
* 制作山东大煎饼的算法
*/
public class MakeShanDongPancake implements MakePancakeBehavior {
@Override
public void makePancake() {
System.out.println("制作山东大煎饼,大转盘,玉米面");
}
}
/**
* 制作天津煎饼果子的算法
*/
public class MakeTianJinPancake implements MakePancakeBehavior {
@Override
public void makePancake() {
System.out.println("制作天津煎饼,夹果子");
}
}
/**
* 制作西式煎饼的算法
*/
public class MakeWesternPancake implements MakePancakeBehavior {
@Override
public void makePancake() {
System.out.println("制作西式煎饼,放番茄酱,洋葱和火腿");
}
}
/************************************/
/**
* 煎饼店,抽象类不能被实例化
*/
public abstract class PancakeShop {
private MakePancakeBehavior makePancakeBehavior;
public PancakeShop(MakePancakeBehavior makePancakeBehavior) {
this.makePancakeBehavior = makePancakeBehavior;
}
public void setMakePancakeBehavior(MakePancakeBehavior makePancakeBehavior) {
this.makePancakeBehavior = makePancakeBehavior;
}
public void sellPancake() {
makePancakeBehavior.makePancake();
}
}
/************************************/
/**
* 北京的煎饼店
*/
public class PancakeShopInBeiJing extends PancakeShop {
//通过构造函数,传入了制作山东煎饼的算法
public PancakeShopInBeiJing() {
super(new MakeShanDongPancake());
}
}
/**
* 天津的煎饼店
*/
public class PancakeShopInTianJin extends PancakeShop {
//通过构造函数,传入了制作天津煎饼果子的算法
public PancakeShopInTianJin() {
super(new MakeTianJinPancake());
}
}
/************************************/
public class PanCakeShopTest {
public static void main(String[] args) {
PancakeShop TJShop = new PancakeShopInTianJin();
TJShop.sellPancake();
//制作天津煎饼,夹果子
PancakeShop BJShop = new PancakeShopInBeiJing();
BJShop.sellPancake();
//制作山东大煎饼,大转盘,玉米面
//通过策略模式可以快速替换算法,比如北京的煎饼店创新了,改做西式煎饼了
BJShop.setMakePancakeBehavior(new MakeWesternPancake());
BJShop.sellPancake();
//制作西式煎饼,放番茄酱,洋葱和火腿
}
}