设计模式之策略模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式之策略模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3049字,纯文字阅读大概需要5分钟。
内容图文
总体来说设计模式分为三大类:
创建型模式5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
策略模式
通过父类与子类的关系进行实现
它是一种行为模式。用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略。实现过程为,定义不同的算法策略,然后客户端把算法策略作为它的一个参数。
一般步骤:
①对策略对象定义一个公共接口
②编写具体策略类,该类实现了上面的接口
③在使用策略对象的类(即:环境角色)中保存一个对策略对象的引用
④在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
⑤客户端进行调用
Demo:购物流程付款案例
首先,创建一个接口
public interface PaymentStrategy {
public void pay(int amount);//付款金额作为参数
}
其次,创建算法策略实体类
public classCreditCardStrategyimplementsPaymentStrategy {//信用卡
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 classPaypalStrategyimplementsPaymentStrategy {//支付宝
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 classItem {//商品类
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 classShoppingCart {//购物车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 classShoppingCartTest {
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接口不同实现,对象会被不同的方法排序。
原文:http://blog.csdn.net/sulikali/article/details/51329549
内容总结
以上是互联网集市为您收集整理的设计模式之策略模式全部内容,希望文章能够帮你解决设计模式之策略模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。