马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
媒介:
在 Java 编程里,设计模式是被反复利用、多数人知晓、经过分类编目的代码设计履历总结。他能资助开辟者更高效地解决常见问题,提升代码的可维护性、可扩展性和复用性。下面介绍Java 中几种常见的设计模式。
- 单例模式(Singleton Pattern)
- 工厂模式(Factory Pattern)
- 代理模式(Proxy Pattern)
- 装饰器模式(Decorator Pattern)
- 观察者模式(Observer Pattern)
- 战略模式(Strategy Pattern)
- 模板方法模式(Template Method Pattern)
- 适配器模式(Adapter Pattern)
- 责任链模式(Chain of Responsibility Pattern)
1.单例模式(Singleton Pattern)
核心思想:封装化所有构造方法确保一个类只有一个实例,并提供一个全局访问点。
示例:- public class Singleton {
- // 类加载时不创建实例
- private static volatile Singleton instance;
- // 私有构造函数,防止外部实例化
- private Singleton() {}
- // 提供全局访问点,使用双重检查锁定机制保证线程安全
- public static Singleton getInstance() {
- if (instance == null) {
- synchronized (Singleton.class) {
- if (instance == null) {
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- }
复制代码 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;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
复制代码 3.代理模式(Proxy Pattern)
核心思想:为其他对象提供一种代理以控制对这个对象的访问。
示例:- // 抽象主题接口
- public interface Subject {
- void request();
- }
- // 真实主题类
- public class RealSubject implements Subject {
- @Override
- public void request() {
- System.out.println("RealSubject request");
- }
- }
- // 代理类
- public class Proxy implements Subject {
- private RealSubject realSubject;
- @Override
- public void request() {
- if (realSubject == null) {
- realSubject = new RealSubject();
- }
- realSubject.request(); // 代理控制对真实主题的访问
- }
- }
- // 客户端代码
- public class Client {
- public static void main(String[] args) {
- Subject proxy = new Proxy();
- proxy.request(); // 通过代理访问真实主题
- }
- }
复制代码 4.装饰器模式(Decorator Pattern)
核心思想:装饰器模式动态地给一个对象添加一些额外的职责。
示例:- // 接口
- interface Coffee {
- double getCost();
- String getDescription();
- }
- // 基础实现
- class SimpleCoffee implements Coffee {
- @Override
- public double getCost() {
- return 1.0;
- }
- @Override
- public String getDescription() {
- return "简单咖啡";
- }
- }
- // 装饰器抽象类
- abstract class CoffeeDecorator implements Coffee {
- protected Coffee decoratedCoffee;
- public CoffeeDecorator(Coffee decoratedCoffee) {
- this.decoratedCoffee = decoratedCoffee;
- }
- @Override
- public double getCost() {
- return decoratedCoffee.getCost();
- }
- @Override
- public String getDescription() {
- return decoratedCoffee.getDescription();
- }
- }
- // 具体装饰器
- class Milk extends CoffeeDecorator {
- public Milk(Coffee decoratedCoffee) {
- super(decoratedCoffee);
- }
- @Override
- public double getCost() {
- return decoratedCoffee.getCost() + 0.5;
- }
- @Override
- public String getDescription() {
- return decoratedCoffee.getDescription() + ", 加牛奶";
- }
- }
复制代码 5.观察者模式(Observer Pattern)
核心思想:观察者模式界说对象间的一种一对多的依靠关系,当一个对象的状态发生改变时,所有依靠它的对象都会得到通知并被自动更新。
示例:- import java.util.ArrayList;
- import java.util.List;
- // 主题接口
- interface Subject {
- void registerObserver(Observer o);
- void removeObserver(Observer o);
- void notifyObservers();
- }
- // 观察者接口
- interface Observer {
- void update(double temperature, double humidity, double pressure);
- }
- // 具体主题
- class WeatherData implements Subject {
- private List<Observer> observers;
- private double temperature;
- private double humidity;
- private double 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 measurementsChanged() {
- notifyObservers();
- }
- public void setMeasurements(double temperature, double humidity, double pressure) {
- this.temperature = temperature;
- this.humidity = humidity;
- this.pressure = pressure;
- measurementsChanged();
- }
- }
复制代码 6.战略模式(Strategy Pattern)
核心思想:战略模式界说一系列的算法,并将每个算法封装起来,使他们可以相互更换。
示例:- // 策略接口
- interface PaymentStrategy {
- void pay(int amount);
- }
- // 具体策略
- class CreditCardStrategy implements PaymentStrategy {
- private String cardNumber;
- private String cvv;
- private String dateOfExpiry;
- public CreditCardStrategy(String cardNumber, String cvv, String dateOfExpiry) {
- this.cardNumber = cardNumber;
- this.cvv = cvv;
- this.dateOfExpiry = dateOfExpiry;
- }
- @Override
- public void pay(int amount) {
- System.out.println(amount + " 元使用信用卡支付");
- }
- }
- class PayPalStrategy implements PaymentStrategy {
- private String emailId;
- private String password;
- public PayPalStrategy(String emailId, String password) {
- this.emailId = emailId;
- this.password = password;
- }
- @Override
- public void pay(int amount) {
- System.out.println(amount + " 元使用PayPal支付");
- }
- }
- // 上下文
- class ShoppingCart {
- private PaymentStrategy paymentStrategy;
- public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
- this.paymentStrategy = paymentStrategy;
- }
- public void pay(int amount) {
- paymentStrategy.pay(amount);
- }
- }
复制代码 7.模板方法模式(Template Method Pattern)
核心思想:模板方法模式界说一个操作中的算法的骨架,而将一些步调耽误到子类中。
示例:- // 抽象类
- abstract class Game {
- abstract void initialize();
- abstract void startPlay();
- abstract void endPlay();
- // 模板方法
- public final void play() {
- // 初始化游戏
- initialize();
- // 开始游戏
- startPlay();
- // 结束游戏
- endPlay();
- }
- }
- // 具体类
- class Cricket extends Game {
- @Override
- void initialize() {
- System.out.println("板球游戏初始化,准备场地");
- }
- @Override
- void startPlay() {
- System.out.println("板球游戏开始,玩起来!");
- }
- @Override
- void endPlay() {
- System.out.println("板球游戏结束,统计分数");
- }
- }
- class Football extends Game {
- @Override
- void initialize() {
- System.out.println("足球游戏初始化,准备场地和球");
- }
- @Override
- void startPlay() {
- System.out.println("足球游戏开始,踢起来!");
- }
- @Override
- void endPlay() {
- System.out.println("足球游戏结束,统计分数");
- }
- }
复制代码 8.适配器模式(Adapter Pattern)
核心思想:适配器模式将一个类的接口转换成客户盼望的另外一个接口。
示例:- // 目标接口
- interface MediaPlayer {
- void play(String audioType, String fileName);
- }
- // 被适配的类
- class VlcPlayer {
- public void playVlc(String fileName) {
- System.out.println("播放VLC文件: " + fileName);
- }
- }
- // 适配器
- class MediaAdapter implements MediaPlayer {
- private VlcPlayer vlcPlayer;
- public MediaAdapter() {
- vlcPlayer = new VlcPlayer();
- }
- @Override
- public void play(String audioType, String fileName) {
- if (audioType.equalsIgnoreCase("vlc")) {
- vlcPlayer.playVlc(fileName);
- }
- }
- }
- // 具体实现类
- class AudioPlayer implements MediaPlayer {
- private MediaAdapter mediaAdapter;
- @Override
- public void play(String audioType, String fileName) {
- if (audioType.equalsIgnoreCase("vlc")) {
- mediaAdapter = new MediaAdapter();
- mediaAdapter.play(audioType, fileName);
- } else {
- System.out.println("播放 " + audioType + " 文件: " + fileName);
- }
- }
- }
复制代码 9.责任链模式(Chain of Responsibility Pattern)
核心思想:责任链模式为哀求创建了一个接收者对象的链,每个接收者都包含对另一个接收者的引用。
示例:- // 抽象处理者
- abstract class Handler {
- protected Handler nextHandler;
- public void setNextHandler(Handler nextHandler) {
- this.nextHandler = nextHandler;
- }
- public abstract void handleRequest(int request);
- }
- // 具体处理者
- class ConcreteHandler1 extends Handler {
- @Override
- public void handleRequest(int request) {
- if (request < 10) {
- System.out.println("处理请求: " + request);
- } else if (nextHandler != null) {
- nextHandler.handleRequest(request);
- }
- }
- }
- class ConcreteHandler2 extends Handler {
- @Override
- public void handleRequest(int request) {
- if (request >= 10 && request < 20) {
- System.out.println("处理请求: " + request);
- } else if (nextHandler != null) {
- nextHandler.handleRequest(request);
- }
- }
- }
- class ConcreteHandler3 extends Handler {
- @Override
- public void handleRequest(int request) {
- if (request >= 20) {
- System.out.println("处理请求: " + request);
- } else if (nextHandler != null) {
- nextHandler.handleRequest(request);
- }
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|