设计模式之策略模式

总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

策略模式

通过父类与子类的关系进行实现
它是一种行为模式。用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略。实现过程为,定义不同的算法策略,然后客户端把算法策略作为它的一个参数。
一般步骤:
①对策略对象定义一个公共接口
②编写具体策略类,该类实现了上面的接口
③在使用策略对象的类(即:环境角色)中保存一个对策略对象的引用
④在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
⑤客户端进行调用

Demo:购物流程付款案例

首先,创建一个接口
public interface PaymentStrategy {
    public void pay(int amount);//付款金额作为参数
}
其次,创建算法策略实体类
public class CreditCardStrategy implements PaymentStrategy {//信用卡

    private String name;
    private String cardNumber;
    private String cvv;
    private String dateOfExpiry;

    public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
        this.name=nm;
        this.cardNumber=ccNum;
        this.cvv=cvv;
        this.dateOfExpiry=expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println("信用卡付款金额:"+amount+"元");
    }

}
public class PaypalStrategy implements PaymentStrategy {//支付宝

    private String userName;
    private String password;

    public PaypalStrategy(String userName, String pwd){
        this.userName=userName;
        this.password=pwd;
    }

    @Override
    public void pay(int amount) {
        System.out.println("支付宝付款金额:"+amount+"元");
    }

}
public class Item {//商品类

    private String upcCode;//条形码
    private int price;//价格

    public Item(String upc, int cost){
        this.upcCode=upc;
        this.price=cost;
    }

    public String getUpcCode() {
        return upcCode;
    }

    public int getPrice() {
        return price;
    }

}
public class ShoppingCart {//购物车

    List<Item> items;//购物单

    public ShoppingCart(){
        this.items=new ArrayList<Item>();
    }

    public void addItem(Item item){
        this.items.add(item);
    }

    public void removeItem(Item item){
        this.items.remove(item);
    }

    public int calculateTotal(){
        int sum = 0;
        for(Item item : items){
            sum += item.getPrice();
        }
        return sum;
    }

    public void pay(PaymentStrategy paymentMethod){
    //此处的支付方法接受支付策略作为参数,但是不在其内部保存任何实例变量。
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}
然后,创建测试类
public class ShoppingCartTest {

    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item item1 = new Item("1234",10);
        Item item2 = new Item("5678",40);

        cart.addItem(item1);
        cart.addItem(item2);
        //信用卡支付
        cart.pay(new CreditCardStrategy("sulikali", "1234567890123456", "786", "12/15"));
        //支付宝支付
        cart.pay(new PaypalStrategy("username", "mypwd"));      
    }

}
最后,查看输出结果


信用卡付款金额:50元
支付宝付款金额:50元

策略模式的优缺点:
优点
①策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
②使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
缺点
①客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
②由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
Java中的排序对象的案例
Collection.sort()方法了,它使用Comparator对象作为参数。根据Comparator接口不同实现,对象会被不同的方法排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值