设计模式—— 一.策略模式 (2)

1.案例(项目案例)

 

   假设自己写一个框架,有个功能是更换主题的功能,默认提供了默认颜色(DefaultTheme)的功能,开发者可以进行拓展自定义主题,这个时候就可以用到策略模式:

     这个例子太简单了。。用在说明策略模式实现了设计模式的原则之一,即“开闭原则”,“”就是说明我提供的代码不能让别人修改,对别人来说是关闭的,这样可以避免出错和解耦,但是可以在这基础上进行修改,这就是""。案例这样的功能也可以写成一个工具类然后里面写成静态方法,然后你要添加新的功能在往里面添加新的方法,但是这样就不符合开闭原则了,别人要写新的功能还得在你代码的基础上进行修改。理论上别人的代码我们都不动,我们只写自己要用的代码,然后只需要测试自己的代码就行了。

2.案例(项目案例)

   实际的例子会复杂点,比如继承的接口会有参数(如果不仅有共同的功能还有共同的数据,那这里继承的就是抽象类),实现类会有成员变量和其他的方法。

   网上找个了购物车的例子(实际上好像没什么用呀..),这个比较简单可以看下:

     购物有2种支付方式,一种是信用卡,一种是paypal

package mytest.shoppingCartDemo;

//支付接口
public interface PaymentStrategy {
	
	public void pay(int amount);

}
package mytest.shoppingCartDemo;

//paypal支付
public class PaypalStrategy implements PaymentStrategy{

	private String emailId;
	private String password;
	
	public PaypalStrategy(String emailId, String password ) {
		this.emailId = emailId;
		this.password = password;
	}

	@Override
	public void pay(int amount) {
		// TODO Auto-generated method stub
		System.out.println(amount + "paid using Paypal");
	}

}
package mytest.shoppingCartDemo;

//信用卡支付
public class CreditCardStrategy implements PaymentStrategy{

	 public String name;
	 public String cardNumber;
	 public String dateOfExpiry;
 
	public CreditCardStrategy(String name, String cardNumber,
			String dateOfExpiry) {
		 this.name = name;
		 this.cardNumber = cardNumber;
		 this.dateOfExpiry = dateOfExpiry;
	}

	@Override
	public void pay(int amount) {
		// TODO Auto-generated method stub
		System.out.println(amount + "paid with credit/debit card");
	}
	
}
package mytest.shoppingCartDemo;

//商品
public class Item {
	
	private String upcCode;
	
	private int price;

	public Item(String upcCode, int price){
		this.upcCode = upcCode;
		this.price = price;
	}
	
	public String getUpcCode() {
		return upcCode;
	}

	public int getPrice() {
		return price;
	}

}
package mytest.shoppingCartDemo;

import java.util.ArrayList;
import java.util.List;

//购物车
public class ShoppingCart {

	List<Item> itemsList;
	
	
	public ShoppingCart(){
		 this.itemsList = new ArrayList<Item>();
		
	}
	
	public void addItem(Item item){
		this.itemsList.add(item);
	}
	
	
	public void removeItem(Item item){
		this.itemsList.remove(item);
	}
	
	public int calculateTotal(){
		int sum = 0;
		for(Item item : itemsList){
			sum += item.getPrice();
		}
		return sum;
	}
	
	public void pay(PaymentStrategy paymentStrategy) {
		int amount = calculateTotal();
		paymentStrategy.pay(amount);
		
	}

	
}
package mytest.shoppingCartDemo;

public class ShoppingCartTest {

	
	public static void main(String[] args) {
        	
			ShoppingCart cart = new ShoppingCart();
			
			Item item1 = new Item("1234",10);
			Item item2 = new Item("5678",10);
			cart.addItem(item1);
			cart.addItem(item2);
			
			//pay by paypal
			cart.pay(new PaypalStrategy("paypal@example.com", "mypwd"));
			
			//pay by credit card
		    cart.pay(new CreditCardStrategy("pand", "2342424242", "2018/2/44"));
		
		}
	
}

打印结果:

20paid using Paypal
20paid with credit/debit card

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值