Java中的模板方法模式与策略模式实战应用

蓝色海洋之心 2020-06-05 ⋅ 15 阅读

模板方法模式

模板方法模式属于行为型设计模式,它定义了一个操作的算法骨架,并将某些步骤的具体实现延迟到子类中。模板方法模式使得子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤。

实例应用

假设我们要开发一个游戏,该游戏有多个角色,每个角色都需要进行攻击,但是不同的角色有不同的攻击方式。

第一步:创建一个抽象类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");
    }
  
}

第二步:创建具体的角色类,如WarriorWizard,并实现模板方法中的抽象方法。

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);
  
}

第二步:创建具体的策略类,如FixedDiscountStrategyPercentageDiscountStrategy,并实现折扣计算方法。

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

结论

模板方法模式和策略模式都可以用于在不同的场景下实现可变的行为。模板方法模式通过定义一个算法骨架,将具体步骤的实现交给子类,实现了代码重用和可扩展性。策略模式通过将算法封装在独立的策略类中,使得算法的变化独立于使用算法的客户端,提供了更灵活的替换和扩展性。在开发过程中,根据需求选择合适的设计模式可以提高代码的可读性和可维护性。


全部评论: 0

    我有话说: