模板方法模式
模板方法模式属于行为型设计模式,它定义了一个操作的算法骨架,并将某些步骤的具体实现延迟到子类中。模板方法模式使得子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。
实例应用
假设我们要开发一个游戏,该游戏有多个角色,每个角色都需要进行攻击,但是不同的角色有不同的攻击方式。
第一步:创建一个抽象类GameCharacter
,表示游戏角色,并且定义一个模板方法attack()
。
public abstract class GameCharacter {
public void attack() {
prepareWeapon();
performAttack();
cleanUp();
}
public abstract void prepareWeapon();
public abstract void performAttack();
public void cleanUp() {
System.out.println("Cleaning up after attack");
}
}
第二步:创建具体的角色类,如Warrior
和Wizard
,并实现模板方法中的抽象方法。
public class Warrior extends GameCharacter {
@Override
public void prepareWeapon() {
System.out.println("Equiping sword and shield");
}
@Override
public void performAttack() {
System.out.println("Swinging sword");
}
}
public class Wizard extends GameCharacter {
@Override
public void prepareWeapon() {
System.out.println("Equiping wand");
}
@Override
public void performAttack() {
System.out.println("Casting fireball");
}
}
第三步:使用具体的角色进行攻击。
public class Main {
public static void main(String[] args) {
GameCharacter warrior = new Warrior();
GameCharacter wizard = new Wizard();
warrior.attack();
wizard.attack();
}
}
输出结果:
Equiping sword and shield
Swinging sword
Cleaning up after attack
Equiping wand
Casting fireball
Cleaning up after attack
策略模式
策略模式属于行为型设计模式,它定义了一系列的算法,并将每个算法封装在独立的策略类中,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。
实例应用
假设我们要开发一个商场促销系统,该系统根据不同的促销策略计算折扣金额。
第一步:创建一个抽象策略接口DiscountStrategy
,定义一个计算折扣金额的方法。
public interface DiscountStrategy {
double calculateDiscount(double totalPrice);
}
第二步:创建具体的策略类,如FixedDiscountStrategy
和PercentageDiscountStrategy
,并实现折扣计算方法。
public class FixedDiscountStrategy implements DiscountStrategy {
private double fixedAmount;
public FixedDiscountStrategy(double fixedAmount) {
this.fixedAmount = fixedAmount;
}
@Override
public double calculateDiscount(double totalPrice) {
if (totalPrice > fixedAmount) {
return fixedAmount;
}
return 0;
}
}
public class PercentageDiscountStrategy implements DiscountStrategy {
private double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double calculateDiscount(double totalPrice) {
return totalPrice * percentage;
}
}
第三步:创建一个促销策略选择器类PromotionSelector
,根据不同的促销策略选择对应的折扣策略。
public class PromotionSelector {
private DiscountStrategy strategy;
public PromotionSelector(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double calculateDiscountAmount(double totalPrice) {
return strategy.calculateDiscount(totalPrice);
}
}
第四步:使用不同的促销策略计算折扣金额。
public class Main {
public static void main(String[] args) {
PromotionSelector fixedDiscountPromotion = new PromotionSelector(new FixedDiscountStrategy(100));
PromotionSelector percentageDiscountPromotion = new PromotionSelector(new PercentageDiscountStrategy(0.2));
double totalPrice = 500;
double fixedDiscount = fixedDiscountPromotion.calculateDiscountAmount(totalPrice);
double percentageDiscount = percentageDiscountPromotion.calculateDiscountAmount(totalPrice);
System.out.println("Fixed discount: " + fixedDiscount);
System.out.println("Percentage discount: " + percentageDiscount);
}
}
输出结果:
Fixed discount: 100.0
Percentage discount: 100.0
结论
模板方法模式和策略模式都可以用于在不同的场景下实现可变的行为。模板方法模式通过定义一个算法骨架,将具体步骤的实现交给子类,实现了代码重用和可扩展性。策略模式通过将算法封装在独立的策略类中,使得算法的变化独立于使用算法的客户端,提供了更灵活的替换和扩展性。在开发过程中,根据需求选择合适的设计模式可以提高代码的可读性和可维护性。
本文来自极简博客,作者:蓝色海洋之心,转载请注明原文链接:Java中的模板方法模式与策略模式实战应用