Java中常见的设计模式及其实际应用

本文详细介绍了Java编程中常见的九种设计模式:单例、工厂、观察者、装饰器、策略、原型、适配器、桥接和建造者,通过示例展示了它们在实际项目中的应用场景和作用。
摘要由CSDN通过智能技术生成

在软件开发中,设计模式是重要的指导原则,它们提供了解决特定问题的可重用方案。Java作为一种强大的编程语言,广泛应用了许多设计模式。让我们深入探讨几种常见的设计模式,并展示它们在实际Java应用中的用例。

1. 单例模式 (Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {
    private static Singleton instance;

    private Singleton() {} // 私有构造函数

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

// 在实际应用中的使用:
public class SingletonApp {
    public static void main(String[] args) {
        Singleton obj = Singleton.getInstance();
        // 使用obj进行操作
    }
}

2. 工厂模式 (Factory Pattern)
工厂模式用于创建对象,但将具体创建的逻辑封装在一个单独的类中。

interface Shape {
    void draw();
}

class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个矩形");
    }
}

class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        } else if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

// 在实际应用中的使用:
public class FactoryPatternApp {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();
        Shape circle = shapeFactory.getShape("CIRCLE");
        circle.draw(); // 输出:画一个圆形

        Shape rectangle = shapeFactory.getShape("RECTANGLE");
        rectangle.draw(); // 输出:画一个矩形
    }
}

3. 观察者模式 (Observer Pattern)
观察者模式用于对象之间的一对多依赖关系,当一个对象状态改变时,其依赖对象会得到通知并自动更新。

import java.util.ArrayList;
import java.util.List;

interface Observer {
    void update();
}

class Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }

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

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

class BinaryObserver implements Observer {
    private Subject subject;

    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Binary String: " + Integer.toBinaryString(subject.getState()));
    }
}

// 在实际应用中的使用:
public class ObserverPatternApp {
    public static void main(String[] args) {
        Subject subject = new Subject();

        new BinaryObserver(subject);

        subject.setState(10); // 输出:Binary String: 1010
    }
}

4. 装饰器模式 (Decorator Pattern)
装饰器模式允许向现有对象动态地添加新功能,它是继承的替代方案。

interface Shape {
    void draw();
}

class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆形");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画一个矩形");
    }
}

abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    public void draw() {
        decoratedShape.draw();
    }
}

class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    @Override
    public void draw() {
        decoratedShape.draw();
        setRedBorder(decoratedShape);
    }

    private void setRedBorder(Shape decoratedShape) {
        System.out.println("边框颜色:红色");
    }
}

// 在实际应用中的使用:
public class DecoratorPatternApp {
    public static void main(String[] args) {
        Shape circle = new Circle();

        Shape redCircle = new RedShapeDecorator(new Circle());
        Shape redRectangle = new RedShapeDecorator(new Rectangle());

        circle.draw(); // 输出:画一个圆形

        redCircle.draw();
        // 输出:
        // 画一个圆形
        // 边框颜色:红色

        redRectangle.draw();
        // 输出:
        // 画一个矩形
        // 边框颜色:红色
    }
}

5. 策略模式 (Strategy Pattern)
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,使得算法可独立于使用它的客户而变化。

interface Strategy {
    int doOperation(int num1, int num2);
}

class OperationAdd implements Strategy {
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

class OperationSubtract implements Strategy {
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

// 在实际应用中的使用:
public class StrategyPatternApp {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    }
}

6. 原型模式 (Prototype Pattern)
原型模式用于创建对象的一种方式,通过复制现有对象来生成新对象,避免了构造函数的执行。

import java.util.HashMap;
import java.util.Map;

abstract class Shape implements Cloneable {
    protected String type;

    abstract void draw();

    public String getType() {
        return type;
    }

    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

class Circle extends Shape {
    public Circle() {
        type = "Circle";
    }

    @Override
    void draw() {
        System.out.println("画一个圆形");
    }
}

class Rectangle extends Shape {
    public Rectangle() {
        type = "Rectangle";
    }

    @Override
    void draw() {
        System.out.println("画一个矩形");
    }
}

class ShapeCache {
    private static Map<String, Shape> shapeMap = new HashMap<>();

    public static Shape getShape(String shapeId) {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape) cachedShape.clone();
    }

    public static void loadCache() {
        Circle circle = new Circle();
        circle.draw();
        shapeMap.put(circle.getType(), circle);

        Rectangle rectangle = new Rectangle();
        rectangle.draw();
        shapeMap.put(rectangle.getType(), rectangle);
    }
}

// 在实际应用中的使用:
public class PrototypePatternApp {
    public static void main(String[] args) {
        ShapeCache.loadCache();

        Shape clonedShape1 = ShapeCache.getShape("Circle");
        System.out.println("Shape : " + clonedShape1.getType());

        Shape clonedShape2 = ShapeCache.getShape("Rectangle");
        System.out.println("Shape : " + clonedShape2.getType());
    }
}

7. 适配器模式 (Adapter Pattern)
适配器模式允许接口不兼容的类能够一起工作,将一个类的接口转换成客户希望的另一个接口。

interface MediaPlayer {
    void play(String audioType, String fileName);
}

interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // do nothing
    }
}

class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        // do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: " + fileName);
        } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}

// 在实际应用中的使用:
public class AdapterPatternApp {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3", "beyond the horizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far far away.vlc");
        audioPlayer.play("avi", "mind me.avi");
    }
}

8. 桥接模式 (Bridge Pattern)
桥接模式将抽象部分与它的实现部分分离,以便两者能够独立地变化。

interface DrawAPI {
    void drawCircle(int radius, int x, int y);
}

class RedCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}

class GreenCircle implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}

abstract class Shape {
    protected DrawAPI drawAPI;

    protected Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    public abstract void draw();
}

class Circle extends Shape {
    private int x, y, radius;

    public Circle(int x, int y, int radius, DrawAPI drawAPI) {
        super(drawAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    public void draw() {
        drawAPI.drawCircle(radius, x, y);
    }
}

// 在实际应用中的使用:
public class BridgePatternApp {
    public static void main(String[] args) {
        Shape redCircle = new Circle(100, 100, 10, new RedCircle());
        Shape greenCircle = new Circle(100, 100, 10, new GreenCircle());

        redCircle.draw();
        greenCircle.draw();
    }
}

9. 建造者模式 (Builder Pattern)
建造者模式用于构建复杂对象,将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

class Meal {
    private String drink;
    private String mainCourse;
    private String side;

    public void setDrink(String drink) {
        this.drink = drink;
    }

    public void setMainCourse(String mainCourse) {
        this.mainCourse = mainCourse;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public void showItems() {
        System.out.println("Drink: " + drink);
        System.out.println("Main Course: " + mainCourse);
        System.out.println("Side: " + side);
    }
}

interface MealBuilder {
    void buildDrink();

    void buildMainCourse();

    void buildSide();

    Meal getMeal();
}

class VegMealBuilder implements MealBuilder {
    private Meal meal = new Meal();

    public void buildDrink() {
        meal.setDrink("Water");
    }

    public void buildMainCourse() {
        meal.setMainCourse("Salad");
    }

    public void buildSide() {
        meal.setSide("Bread");
    }

    public Meal getMeal() {
        return meal;
    }
}

class MealDirector {
    public Meal createMeal(MealBuilder mealBuilder) {
        mealBuilder.buildDrink();
        mealBuilder.buildMainCourse();
        mealBuilder.buildSide();
        return mealBuilder.getMeal();
    }
}

// 在实际应用中的使用:
public class BuilderPatternApp {
    public static void main(String[] args) {
        MealBuilder vegMealBuilder = new VegMealBuilder();
        MealDirector mealDirector = new MealDirector();

        Meal meal = mealDirector.createMeal(vegMealBuilder);
        meal.showItems();
    }
}
  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java设计模式是一种用来解决特定场景问题的最佳实践。在面试过程,对设计模式的理解和应用能力是非常重要的。下面我将介绍几种常用的设计模式及其应用场景。 工厂模式(Factory Pattern)是Java最常用的设计模式之一,属于创建型模式。它通过提供一种统一的接口来创建对象,使得代码更加清晰易读。工厂模式的应用场景包括:当一个类不知道它所需要的对象的类时;当一个类希望由子类来指定所创建对象的类时;当一个类将创建对象的职责委托给多个辅助子类的其一个时。 除了工厂模式,还有其他常用的设计模式。例如,单例模式(Singleton Pattern)用于限制一个类只能创建一个实例,常用于需要全局访问点的场景。适配器模式(Adapter Pattern)用于将一个类的接口转换成客户端所期望的另一个接口,常用于解决接口不兼容的问题。观察者模式(Observer Pattern)用于定义对象间的一对多依赖关系,当一个对象的状态发生变化时,其相关依赖对象都会收到通知,常用于实现事件监听和发布订阅模型。 在面试时,重要的是要将设计模式实际业务场景进行结合,展示出对设计模式的理解和应用能力。举例来说,当面试官问到如何设计一个购物车系统时,可以考虑使用组合模式(Composite Pattern)来表示购物车的商品和商品组,使用策略模式(Strategy Pattern)来实现不同的计价策略,使用观察者模式来实现库存变化时的通知等。通过结合实际场景,能够更好地展示出对设计模式的理解和灵活运用能力。 此外,面试还会涉及Java的基础知识。最常考察的点之一是HashMap和ConcurrentHashMap的区别和使用。HashMap是线程不安全的,适用于单线程环境;而ConcurrentHashMap是线程安全的,适用于多线程环境。此外,面试官可能会问到Java的不同版本新技术特性,需要了解每个版本的更新内容和主要特性,例如Java 8的Lambda表达式和Stream API,Java 9的模块化系统等。 总之,在面试过程,要对不同的设计模式及其应用场景有一定的了解,并能够将其与实际业务场景结合起来。此外,还需掌握Java的基础知识,特别是常考察点如HashMap和ConcurrentHashMap,以及不同版本的新技术特性。这样才能给面试官留下深刻的印象。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT Talk

谢谢您对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值