策略模式 java

2018-10-09  本文已影响0人  iarchitect

策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得他们可以互相转换。

类型:属于对象的行为模式。

角色:
环境角色:持有一个抽象策略类或策略接口的引用。
抽象策略角色:这是一个抽象角色,由一个接口或抽象类实现。
具体策略角色:封装相关算法或行为。重写抽象策略角色声明的方法。

示例:
商店对不同级别的会员有不同折扣,算法如下:
普通会员无折扣,白银会员95折,黄金会员90折。

代码:
抽象策略角色

public interface MemberI {
    public double calcPrice(double price);
}

具体策略角色

public class PrimaryMember implements MemberI {
    @Override
    public double calcPrice(double price) {
        System.out.println("普通会员没有折扣");
        return price;
    }
}

具体策略角色

public class SilverMember implements MemberI {
    @Override
    public double calcPrice(double price) {
        System.out.println("白银会员,95折");
        return price*0.95;
    }
}

具体策略角色

public class GoldMember implements MemberI {
    @Override
    public double calcPrice(double price) {
        System.out.println("黄金会员,9折");
        return price*0.9;
    }
}

环境角色

public class Price {

    //持有一个具体的策略对象

    private MemberI memberI;
    //通过构造函数,传入一个具体的策略对象

    public Price(MemberI memberI) {
        this.memberI = memberI;
    }

    //计算商品价格
    public double calcPrice(double price){
        return  this.memberI.calcPrice(price);
    }
}

客户端

public class Client {

    public static void main(String[] args) {

        //创建并选取需要使用的策略对象
        MemberI memberI = new SilverMember();
        //创建环境
        Price price = new Price(memberI);
        //计算价格
        double goodPrice = price.calcPrice(100);
        System.out.println("商品经过打折价格为:"+goodPrice);
    }
}

运行结果:


image.png

该模式的优点:
1,通过策略类的等级结构来管理算法族。
2,避免在一个类中为了使用不同的算法,将算法的实现和选择混合在一起的多重条件(if-else if-else)语句。
缺点:
1,客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
2,由于策略模式把每个算法的具体实现都单独封装成类,针对不同的情况生成的对象会变得很多。

上一篇 下一篇

猜你喜欢

热点阅读