Head First设计模式中的典型设计模式解析与案例分析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Head First设计模式中的典型设计模式解析与案例分析

一、策略模式(Strategy Pattern)

  1. 模式解析

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

  1. 应用场景

策略模式常用于需要在运行时选择不同算法的场景,比如排序算法、加密算法等。

示例代码:

package cn.juwatech.designpatterns.strategy;
interface QuackBehavior {
    void quack();
}
class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Quack!");
    }
}
class Squeak implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("Squeak!");
    }
}
class MuteQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("<< Silence >>");
    }
}
class Duck {
    private QuackBehavior quackBehavior;
    public Duck(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
    public void performQuack() {
        quackBehavior.quack();
    }
    public void setQuackBehavior(QuackBehavior quackBehavior) {
        this.quackBehavior = quackBehavior;
    }
}
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Duck mallard = new Duck(new Quack());
        mallard.performQuack();
        Duck rubberDuck = new Duck(new Squeak());
        rubberDuck.performQuack();
        Duck decoy = new Duck(new MuteQuack());
        decoy.performQuack();
    }
}

二、观察者模式(Observer Pattern)

  1. 模式解析

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,所有依赖于它的观察者对象都会得到通知并更新。

  1. 应用场景

观察者模式常用于需要根据某对象状态变化通知其他对象的场景,如事件监听、数据绑定等。

示例代码:

package cn.juwatech.designpatterns.observer;
import java.util.ArrayList;
import java.util.List;
interface Observer {
    void update(float temp, float humidity, float pressure);
}
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}
class WeatherData implements Subject {
    private List<Observer> observers;
    private float temperature;
    private float humidity;
    private float pressure;
    public WeatherData() {
        observers = new ArrayList<>();
    }
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }
    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature, humidity, pressure);
        }
    }
    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        notifyObservers();
    }
}
class CurrentConditionsDisplay implements Observer {
    private float temperature;
    private float humidity;
    private Subject weatherData;
    public CurrentConditionsDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }
    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();
    }
    public void display() {
        System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
    }
}
public class ObserverPatternDemo {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
        weatherData.setMeasurements(80, 65, 30.4f);
        weatherData.setMeasurements(82, 70, 29.2f);
    }
}

三、装饰者模式(Decorator Pattern)

  1. 模式解析

装饰者模式动态地给对象添加一些额外的职责。装饰者模式提供了比继承更有弹性的替代方案。

  1. 应用场景

装饰者模式常用于需要动态地扩展对象功能的场景,如Java I/O类的设计。

示例代码:

package cn.juwatech.designpatterns.decorator;
abstract class Beverage {
    String description = "Unknown Beverage";
    public String getDescription() {
        return description;
    }
    public abstract double cost();
}
class Espresso extends Beverage {
    public Espresso() {
        description = "Espresso";
    }
    @Override
    public double cost() {
        return 1.99;
    }
}
abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}
class Mocha extends CondimentDecorator {
    Beverage beverage;
    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }
    @Override
    public double cost() {
        return 0.20 + beverage.cost();
    }
}
class Whip extends CondimentDecorator {
    Beverage beverage;
    public Whip(Beverage beverage) {
        this.beverage = beverage;
    }
    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Whip";
    }
    @Override
    public double cost() {
        return 0.10 + beverage.cost();
    }
}
public class DecoratorPatternDemo {
    public static void main(String[] args) {
        Beverage beverage = new Espresso();
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
        beverage = new Mocha(beverage);
        beverage = new Whip(beverage);
        System.out.println(beverage.getDescription() + " $" + beverage.cost());
    }
}

四、单例模式(Singleton Pattern)

  1. 模式解析

单例模式确保一个类只有一个实例,并提供一个全局访问点。

  1. 应用场景

单例模式常用于需要全局唯一实例的场景,如配置管理类、日志类等。

示例代码:

package cn.juwatech.designpatterns.singleton;
public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
    public void showMessage() {
        System.out.println("Hello, I am a Singleton!");
    }
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();
    }
}

五、总结

设计模式提供了解决软件设计中常见问题的成熟方案。在《Head  First设计模式》一书中,策略模式、观察者模式、装饰者模式和单例模式等典型设计模式通过生动的示例和详细的解释,帮助读者更好地理解和应用这些模式。希望通过本文的解析和案例分析,大家能更好地掌握这些设计模式,在实际开发中灵活运用,提高代码的可维护性和扩展性。

相关文章
|
3天前
|
设计模式 Java 开发者
Head First设计模式详解与应用场景分析
Head First设计模式详解与应用场景分析
|
1天前
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
4天前
|
域名解析 监控 网络协议
使用DNSLog进行DNS请求追踪与分析
使用DNSLog进行DNS请求追踪与分析
|
5天前
|
设计模式 Java 中间件
深入探索Java设计模式:责任链模式解析与实践
深入探索Java设计模式:责任链模式解析与实践
6 0
|
5天前
|
设计模式 Java 开发者
Java中的设计模式深度解析
Java中的设计模式深度解析
|
5天前
|
Java UED 开发者
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
JVM逃逸分析原理解析:优化Java程序性能和内存利用效率
|
12天前
|
机器学习/深度学习 缓存 算法
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
netty源码解解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
|
14天前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
23 3
|
6天前
|
Java 数据库连接 Spring
Spring 整合 MyBatis 底层源码解析
Spring 整合 MyBatis 底层源码解析
|
5天前
|
NoSQL Java Redis
【源码解析】自动配置的这些细节都不知道,别说你会 springboot
【源码解析】自动配置的这些细节都不知道,别说你会 springboot

推荐镜像

更多