下面我将详细讲解Java利用策略模式实现条件判断,告别if else的完整攻略。
策略模式简介
在软件开发中,经常会遇到多个算法或行为的选择问题,此时,使用if...else或switch...case来实现条件判断的效率不高,而且代码可读性较差。策略模式则可以很好地解决这个问题。
策略模式的核心思想是将具体算法和行为封装成一个独立的类,使得它们可以相互替换。即将算法和行为从上下文中解耦出来,让它们独立变化,符合开闭原则。
策略模式具有以下优点:
- 策略模式符合开闭原则,可以方便地增加或修改算法和行为。
- 策略模式将算法和行为封装成独立的类,方便单元测试。
- 策略模式提高了代码的可读性,容易维护。
实现步骤
使用策略模式实现条件判断的大体步骤如下:
- 定义一个上下文(Context)类,负责和具体策略类交互,在需要的时候进行策略的切换。
- 定义一个策略(Strategy)接口,用于封装算法或行为。
- 定义具体的策略类(ConcreteStrategy),实现策略接口,并提供具体的算法或行为。
- 在上下文类中,维护一个策略对象,在需要时调用具体策略的方法。
下面我们通过示例来详细讲解。
示例一:实现字符串加密
我们以一个字符串加密的场景为例,来演示策略模式的使用。
首先,我们定义一个加密策略接口:
public interface EncryptStrategy {
String encrypt(String source);
}
然后,我们定义三种具体的加密算法:
public class MD5Encrypt implements EncryptStrategy {
public String encrypt(String source) {
// MD5加密算法
return source + "经过MD5加密后的字符串";
}
}
public class SHAEncrypt implements EncryptStrategy {
public String encrypt(String source) {
// SHA加密算法
return source + "经过SHA加密后的字符串";
}
}
public class DESEncrypt implements EncryptStrategy {
public String encrypt(String source) {
// DES加密算法
return source + "经过DES加密后的字符串";
}
}
最后,我们定义一个上下文类,根据不同的加密策略来加密字符串:
public class EncryptContext {
private EncryptStrategy encryptStrategy;
public EncryptContext(EncryptStrategy encryptStrategy) {
this.encryptStrategy = encryptStrategy;
}
public void setEncryptStrategy(EncryptStrategy encryptStrategy) {
this.encryptStrategy = encryptStrategy;
}
public String encrypt(String source) {
return encryptStrategy.encrypt(source);
}
}
这样,我们就可以使用策略模式来加密字符串了:
public class EncryptTest {
public static void main(String[] args) {
String source = "Hello World!";
EncryptContext context = new EncryptContext(new MD5Encrypt());
System.out.println(context.encrypt(source));
context.setEncryptStrategy(new SHAEncrypt());
System.out.println(context.encrypt(source));
context.setEncryptStrategy(new DESEncrypt());
System.out.println(context.encrypt(source));
}
}
输出结果如下:
Hello World!经过MD5加密后的字符串
Hello World!经过SHA加密后的字符串
Hello World!经过DES加密后的字符串
示例二:根据不同的年龄段打折
下面我们以一个商场打折的场景为例,来演示策略模式的使用。
首先,我们定义一个打折策略接口:
public interface DiscountStrategy {
double discount(double price);
}
然后,我们定义三种具体的打折算法:
public class YouthDiscount implements DiscountStrategy {
public double discount(double price) {
// 青年折扣算法
return price * 0.8;
}
}
public class MiddleAgeDiscount implements DiscountStrategy {
public double discount(double price) {
// 中年折扣算法
return price * 0.9;
}
}
public class OldAgeDiscount implements DiscountStrategy {
public double discount(double price) {
// 老年折扣算法
return price * 0.7;
}
}
最后,我们定义一个上下文类,根据不同的年龄段来打折:
public class DiscountContext {
private DiscountStrategy discountStrategy;
public DiscountContext(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double discount(double price) {
return discountStrategy.discount(price);
}
}
这样,我们就可以使用策略模式来根据不同的年龄段打折了:
public class DiscountTest {
public static void main(String[] args) {
double price = 100;
DiscountContext context = new DiscountContext(new YouthDiscount());
System.out.println(context.discount(price));
context.setDiscountStrategy(new MiddleAgeDiscount());
System.out.println(context.discount(price));
context.setDiscountStrategy(new OldAgeDiscount());
System.out.println(context.discount(price));
}
}
输出结果如下:
80.0
90.0
70.0
总结
策略模式是一种优秀的设计模式,可以很好地解决多个算法或行为的选择问题。使用策略模式可以将算法或行为封装成独立的类,方便单元测试,提高代码的可读性,符合开闭原则。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用策略模式实现条件判断,告别if else - Python技术站