三:为什么学习设计模式很重要?

学习设计模式就像是掌握了编程界的绝世武功,让你在编程江湖中如虎添翼,所向披靡。那么,为什么学习设计模式如此重要呢?
接下来,我们用生动幽默的方式来探讨一下,并带上一些Java代码示例。
人工智能生成图片

1、驾驭狂野的代码丛林

想象一下,你站在一片狂野的代码丛林前,想要找到前进的道路。而设计模式就是那把砍开迷雾的利剑,帮助你在程序的世界里找到清晰的道路。
例如,使用工厂模式,你可以将对象的创建过程与具体类解耦,让代码更加灵活:

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle!");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a square!");
    }
}

public class ShapeFactory {
    public Shape createShape(String shapeType) {
        if ("circle".equalsIgnoreCase(shapeType)) {
            return new Circle();
        } else if ("square".equalsIgnoreCase(shapeType)) {
            return new Square();
        }
        return null;
    }
}

2、掌握编程阵法,锻炼代码筋骨

学习设计模式就像是学会了一套编程阵法,让你在编程世界中更加游刃有余。掌握了这些阵法,你的代码将更加健壮,逻辑清晰,方便维护。
例如,使用策略模式,你可以根据不同情境灵活切换算法:

public interface SortingStrategy {
    void sort(int[] arr);
}

public class BubbleSort implements SortingStrategy {
    @Override
    public void sort(int[] arr) {
        // Bubble sort algorithm
    }
}

public class QuickSort implements SortingStrategy {
    @Override
    public void sort(int[] arr) {
        // Quick sort algorithm
    }
}

public class SortingContext {
    private SortingStrategy strategy;

    public void setStrategy(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void sort(int[] arr) {
        strategy.sort(arr);
    }
}

3、编程江湖中的招牌招式

设计模式就像是编程江湖中的招牌招式,不仅让你的代码变得高效且可靠,还让你在同行面前独占鳌头,名声大噪。
例如,使用单例模式,确保一个类只有一个实例,并提供全局访问点:

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
return instance;
    }
}

4、建立起“代码星际联盟”

设计模式让你的代码组件相互协作,就像星际联盟中的各个星球一样。通过学习设计模式,你可以实现代码组件间的高度解耦和协同,让你的应用变得更加稳定和可扩展。
例如,使用观察者模式,你可以在对象之间建立一对多的依赖关系,当一个对象的状态发生改变时,其依赖者会自动更新:

public interface Observer {
    void update();
}

public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers();
}

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

5、开启编程领域的“奇幻之旅”

设计模式就像是一本神奇的魔法书,教会你如何在编程领域里进行奇幻之旅。你将能够探索各种神奇的编程技巧,不断提升自己的技能,让你的代码更具魅力。
例如,使用组合模式,可以将对象组合成树形结构以表示部分整体的层次关系,并允许对单个对象和组合对象进行一致的操作:

public abstract class Component {
    public void add(Component component) {
        throw new UnsupportedOperationException();
    }

    public void remove(Component component) {
        throw new UnsupportedOperationException();
    }

    public Component getChild(int index) {
        throw new UnsupportedOperationException();
    }

    public void operation() {
        throw new UnsupportedOperationException();
    }
}

public class Composite extends Component {
    private List<Component> children = new ArrayList<>();

    @Override
    public void add(Component component) {
        children.add(component);
    }

    @Override
    public void remove(Component component) {
        children.remove(component);
    }

    @Override
    public Component getChild(int index) {
        return children.get(index);
    }

    @Override
    public void operation() {
        for (Component child : children) {
            child.operation();
        }
    }
}

public class Leaf extends Component {
    @Override
    public void operation() {
        System.out.println("Performing operation on leaf!");
    }
}

6、总结

学习设计模式的重要性在于,它们提供了编程领域的经验和最佳实践,帮助你提高代码质量、可读性和可维护性。当你掌握了设计模式,你将能够在编程世界中游刃有余,驰骋疆场,成为一名真正的编程高手。
如果你不会设计模式,不能将设计模式如鱼得水地应用到开发中,你大概只能当当武林中的小喽啰。
那么你写的代码可能就是下面这样的,这个代码用于创建和打印不同形状的图形,但是它混合了各种逻辑,使得代码难以阅读和维护。

public class BadShapeExample {
    public static void main(String[] args) {
        String shapeType = "circle";
        int radius = 5;
        int width = 10;
        int height = 20;

        if ("circle".equalsIgnoreCase(shapeType)) {
            double area = Math.PI * radius * radius;
            System.out.println("The area of the circle is: " + area);
            System.out.println("Drawing a circle with radius " + radius + "...");
        } else if ("rectangle".equalsIgnoreCase(shapeType)) {
            int area = width * height;
            System.out.println("The area of the rectangle is: " + area);
            System.out.println("Drawing a rectangle with width " + width + " and height " + height + "...");
        } else {
            System.out.println("Unknown shape type: " + shapeType);
        }
    }
}

这段代码存在以下这些问题:
1、混合了创建和打印图形的逻辑,使得代码难以阅读和修改。
2、如果需要添加新的形状类型,需要修改多处代码,不符合开闭原则。
3、没有使用面向对象的特性,如继承和多态,导致代码重复和耦合度高。
4、通过学习并应用设计模式,你可以将这段糟糕的代码进行重构,提高其可读性、可维护性和可扩展性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值