总体来说设计模式分为三大类:
创建型模式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元