策略模式----用摊煎饼的例子讲

定义:

定义了算法族,分别封装起来。让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

结构:

 

 

 

指导思想:

使用组合而不是继承

解决的问题:

在有多种算法相似的情况下,使用 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();
        //制作西式煎饼,放番茄酱,洋葱和火腿

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值