策略模式--条条大路通罗马(行为模式07)

什么是策略模式
策略模式定义了一系列封装好的算法,使他们可以相互替换。
策略模式让算法独立于使用他的客户端独立变化。

策略模式的适用场景
同一种问题有多重处理方式,仅仅在具体实现有差别
需要安全的封装同一类型的操作
实现同一抽象有多个子类,而又需要适用分支操作选择具体子类时

策略模式用例
我们从出发地到目的地可以选择坐公交车,也可以选择打的,公交车比较便宜实惠,打的比较贵但是快且舒适,选择哪一种方式都能实现目的,但是根据实际情况,比如时间紧迫怕堵车可以选择摩的,不怕挤可以选择公交,想要舒适的环境可以多花点钱打的等。

UML用例图
这里写图片描述

IPrice接口:

public interface IPrice {
    int calculatePrice(int distance);
}

BusStrategy:

public class BusStrategy implements IPrice {

    @Override
    public int calculatePrice(int distance) {
        // 公交车票价,起步价1元,3公里外每公里加一元
        int total = distance - 3;
        int mPrice = total + 1;
        return distance>0?mPrice:1;
    }

}

CarStrategy:

public class CarStrategy implements IPrice {

    @Override
    public int calculatePrice(int distance) {
        // 出租车票价,起步价5元,3公里外每公里加3元
        int total = distance - 3;
        int mPrice = total*3 + 5;
        return distance>0?mPrice:5;
    }

}

测试类:

public class Test {
    BusStrategy bs;
    CarStrategy cs;
    public static void main(String[] args) {
        //公交车
        Test test = new Test();
        test.setBusStrategy(new BusStrategy());
        System.out.println("公交车价格:"+test.calculateBusPrice(10)+" 元");

        //出租车
        Test test2 = new Test();
        test2.setCarStrategy(new CarStrategy());
        System.out.println("出租车价格:"+test2.calculateCarPrice(10)+" 元");
    }

    public void setBusStrategy(BusStrategy bs){
        this.bs = bs;
    }

    public int calculateBusPrice(int distance){
        return bs.calculatePrice(distance);
    }

    public void setCarStrategy(CarStrategy cs){
        this.cs = cs;
    }

    public int calculateCarPrice(int distance){
        return cs.calculatePrice(distance);
    }

}

测试结果:

公交车价格:8 元
出租车价格:26 元

策略模式总结:
策略模式主要用来分离算法步骤,比如这个我们把公交和出租车分开来计算,解耦操作。
优点:结构清晰,使用简单。耦合度低,扩展方便。操作封装彻底,数据安全。
缺点:随着策略增多,子类更多,比如我们要加入火车、飞机、轮船等等交通工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值