聊一聊java设计模式(二)

92 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 21 天,点击查看活动详情

每日英语:

Do every act of your life as if it were your last.

把生命中的每一件事都当成最后一件来做。 -马可·奥勒留

除了上一篇介绍的单例模式、工厂模式和观察者模式,还有很多其他常用的设计模式。在这里,我将介绍几种常见的设计模式,并提供相应的Java代码案例。

装饰者模式

装饰者模式(Decorator Pattern)允许你动态地将新功能附加到对象上。它是一种结构型设计模式,它允许你通过将对象包装在一个装饰者对象中来扩展对象的行为。以下是一个Java代码示例:

public interface Pizza {
    String getDescription();
    double getCost();
}

public class BasicPizza implements Pizza {
    @Override
    public String getDescription() {
        return "Basic pizza with tomato sauce and cheese";
    }
    
    @Override
    public double getCost() {
        return 4.99;
    }
}

public abstract class PizzaDecorator implements Pizza {
    protected Pizza pizza;
    
    public PizzaDecorator(Pizza pizza) {
        this.pizza = pizza;
    }
    
    @Override
    public String getDescription() {
        return pizza.getDescription();
    }
    
    @Override
    public double getCost() {
        return pizza.getCost();
    }
}

public class PepperoniDecorator extends PizzaDecorator {
    public PepperoniDecorator(Pizza pizza) {
        super(pizza);
    }
    
    @Override
    public String getDescription() {
        return super.getDescription() + ", pepperoni";
    }
    
    @Override
    public double getCost() {
        return super.getCost() + 1.99;
    }
}

public class MushroomDecorator extends PizzaDecorator {
    public MushroomDecorator(Pizza pizza) {
        super(pizza);
    }
    
    @Override
    public String getDescription() {
        return super.getDescription() + ", mushrooms";
    }
    
    @Override
    public double getCost() {
        return super.getCost() + 0.99;
    }
}

在上面的代码中,Pizza是一个接口,它定义了披萨的基本行为。BasicPizza是一个具体的披萨实现,它是最基本的披萨,只有番茄酱和奶酪。PizzaDecorator是一个抽象的装饰者类,它允许你为披萨添加额外的配料。PepperoniDecoratorMushroomDecorator是两个具体的装饰者类,它们允许你为披萨添加意大利辣味香肠和蘑菇。

模板方法模式

模板方法模式(Template Method Pattern)定义了一个算法的框架,将一些步骤推迟到子类中。它是一种行为型设计模式,它允许你定义一个算法的步骤,并将某些步骤延迟到子类中。以下是一个Java代码示例:

public abstract class Meal {
    public final void doMeal() {
        prepareIngredients();
        cook();
        eat();
        cleanUp();
    }
    
    public abstract void prepareIngredients();
    
    public abstract void cook();
    
    public void eat() {
        System.out.println("The meal is delicious!");
    }
    
    public void cleanUp() {
        System.out.println("The kitchen is clean!");
    }
}

public class SpaghettiMeal extends Meal {
    @Override
    public void prepareIngredients() {
        System.out.println("Gathering ingredients for spaghetti.");
    }
    
    @Override
    public void cook() {
        System.out.println("Cooking spaghetti.");
    }
}

public class HamburgerMeal extends Meal {
    @Override
    public void prepareIngredients() {
        System.out.println("Gathering ingredients for hamburger.");
    }
    
    @Override
    public void cook() {
        System.out.println("Cooking hamburger.");
    }
    
    @Override
    public void eat() {
        System.out.println("The hamburger is delicious!");
    }
}

public class TemplateMethodDemo {
    public static void main(String[] args) {
        Meal spaghettiMeal = new SpaghettiMeal();
        spaghettiMeal.doMeal();
        
        System.out.println();
        
        Meal hamburgerMeal = new HamburgerMeal();
        hamburgerMeal.doMeal();
    }
}

在上面的代码中,Meal是一个抽象类,它定义了一顿饭的模板方法doMeal,其中包含了准备食材、烹饪、用餐和清理的步骤。SpaghettiMealHamburgerMeal是两个具体的餐食实现类,它们分别实现了prepareIngredientscook方法。HamburgerMeal还重写了eat方法,以自定义用餐过程。

TemplateMethodDemo是一个测试类,它创建了一个意大利面餐食和一个汉堡餐食,并分别调用它们的doMeal方法来演示模板方法模式。

策略模式

策略模式(Strategy Pattern)定义了一系列算法,将每个算法封装起来,并使它们可以相互替换。它是一种行为型设计模式,它允许在运行时选择算法的行为。以下是一个Java代码示例:

public interface SortStrategy {
    void sort(int[] dataset);
}

public class BubbleSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] dataset) {
        System.out.println("Sorting using bubble sort strategy");
        // 在此处实现冒泡排序算法
    }
}

public class QuickSortStrategy implements SortStrategy {
    @Override
    public void sort(int[] dataset) {
        System.out.println("Sorting using quick sort strategy");
        // 在此处实现快速排序算法
    }
}

public class Sorter {
    private SortStrategy strategy;
    
    public Sorter(SortStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void setStrategy(SortStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void sort(int[] dataset) {
        strategy.sort(dataset);
    }
}

在上面的代码中,SortStrategy是一个接口,它定义了一个排序算法的方法。BubbleSortStrategyQuickSortStrategy是具体的排序策略实现类,它们实现了SortStrategy接口,并定义了相应的排序算法。Sorter是一个排序器类,它持有一个SortStrategy对象的引用,并使用它来实现排序。

通过这种方式,我们可以在运行时选择使用不同的排序策略,而不需要修改排序器类的代码。例如,我们可以将Sorter对象的策略设置为BubbleSortStrategyQuickSortStrategy,以实现不同的排序算法。这种灵活性使得策略模式成为许多Java应用程序中常用的设计模式之一。

总结

本篇主要讲了一下装饰者模式、模板方法模式、策略模式这三种常用的设计模式,并给了一个代码案例,大家有兴趣的话,可以跑一下案例学习学习。