重要的Java模式——策略模式

本文介绍策略模式的概念,并通过一个具体的买卖场景实例演示如何在运行时改变对象的行为而不影响其实现。策略模式通过定义一系列的算法并将每一个算法封装起来,使它们可以相互替换。

策略模式允许在允许中替换算法。要实现该解决方案,需要将每个算法表示为Strategy(策略)类。然后应用程序委托当前的Strategy类来执行特定于策略的算法。

 

1、Strategy

         下面示例使用Role(充当Strategy)接口来声明策略行为和俩个具体来——Buyer和Seller来实现不同的行为:

Role接口:

package strategy;
public interface Role {
	public boolean siSatisfied(Product product, double price);
}

Seller类:希望销售的产品都设置了20%的利润率

package strategy;

public class Seller implements Role{
	public boolean siSatisfied(Product product, double price) {
		//具有20%的利润
		if(price - product.getCost() > product.getCost() * .2){
			return true;
		}else{
			return false;
		}
	}
}

对于Buyer来说,他要买下此种商品,必须有一个限制额。

package strategy;

public class Buyer implements Role{
	private double limit;
	public Buyer(double limit){
		this.limit = limit;
	}
	public boolean siSatisfied(Product product, double price) {
		if(price < limit && price < product.getCost() * 2){
			return true;
		}
		return false;
	}
}

2、context

         Context这里是指:管理Role的Person类。Person类与Role接口又一个关联,另外值得注意的是,Role又一个setter和getter方法,它允许一个人的角色在程序执行时发生变化。以后,其它的Role实现对象(如broker(中间)等)都可以被添加。因为它们对特定的子类没有依赖。下面时Person类:

package strategy;

public class Person {
	private String name;
	private Role role;
	public Person(String name){
		this.name = name;
	}
	public Role getRole(){
		return role;
	}
	public void setRole(Role role){
		this.role = role;
	}
	public boolean statisfied(Product product, double price){
		//statisfied方法将特定于角色的行为委托给其Role接口。这里多态会选择正确的底层对象。
		return role.isSatisfied(product, price);
	}
}

其它类:本示例的Product类及执行的Main类:

1Product

package strategy;

public class Product {
	private String name;
	private String description;
	private double cost;
	public Product(String name, String description, double cost){
		this.name = name;
		this.description = description;
		this.cost = cost;
	}
	
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
	
	public double getCost() {
		return cost;
	}

	public void setCost(double cost) {
		this.cost = cost;
	}

}

2、Main类

package strategy;

public class Main {
	public static void main(String[] args){
		Product house = new Product("house", "Three room and a parlor", 200000);
		Product laptop = new Product("laptop", "The latest style of lenovo laptop computer", 10000);
		Person liLei = new Person("李雷");
		Person hanMeimei = new Person("韩梅梅");
		liLei.setRole(new Buyer(500000));
		hanMeimei.setRole(new Seller());
		
		if(!hanMeimei.statisfied(house, 200000)){
			System.out.println("韩梅梅房子不会卖200000。");
		}
		if(!liLei.statisfied(house, 6000000)){
			System.out.println("李雷,觉得如果要花6000000买下那房子,太贵了!");
		}
		if(liLei.statisfied(house, 390000) && hanMeimei.statisfied(house, 390000)){
			System.out.println("他们最终已390000的价格成交了!");
			//允许时修改一个对象的行为而不影响它的实现
			hanMeimei.setRole(new Buyer(390000));
			if(hanMeimei.statisfied(laptop, 11000)){
				System.out.println("得到390000,韩梅梅现在花了11000去买进了一台最新款的联系笔记本!");
			}
		}
	}
}

         通过实现策略模式,可以在运行时修改一个对象的行为而不影响它的实现。这是软件设计中非常强大的工具。

### Java策略模式的设计与实现 #### 策略模式简介 策略模式(Strategy Pattern),又称政策模式,是一种行为设计模式。此模式允许定义一系列算法,并将每一个算法封装起来,使它们可以互换使用[^2]。 #### 接口声明公共方法 为了实现策略模式,首先需要创建一个接口来声明所有支持版本的公共操作。例如,在处理不同类型的支付方式时,可以定义 `PaymentStrategy` 接口: ```java public interface PaymentStrategy { void pay(int amount); } ``` #### 创建具体策略类 接着,通过不同的类去实现这个接口中的方法,这些类代表具体的策略。比如信用卡支付和PayPal支付两种不同的付款方式: 对于信用卡支付: ```java public class CreditCardPayment implements PaymentStrategy { private String cardNumber; public CreditCardPayment(String cardNum){ this.cardNumber = cardNum; } @Override public void pay(int amount) { System.out.println(amount + " paid with credit/debit card"); } } ``` 而对于PayPal支付,则有另一个实现: ```java public class PayPalPayment implements PaymentStrategy { private String emailId; public PayPalPayment(String email){ this.emailId=email; } @Override public void pay(int amount) { System.out.println(amount + " paid using PayPal."); } } ``` 上述两个类实现了相同的接口并提供了各自特有的逻辑,这就是所谓的“具体策略”。 #### 上下文环境设置 最后一步是在上下文中利用这些策略对象。这里我们构建了一个购物车的例子,它接受任何实现了 `PaymentStrategy` 的实例作为参数来进行结账过程: ```java class ShoppingCart { private PaymentStrategy paymentMethod; // 构造函数注入依赖关系 public ShoppingCart(PaymentStrategy pm) { this.paymentMethod=pm; } public void checkout() { int totalAmount = calculateTotal(); paymentMethod.pay(totalAmount); } private int calculateTotal(){ // 计算总价... return 100; } } ``` 这样就完成了整个流程:客户端可以选择合适的支付手段传入到购物车内完成交易动作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值