设计模式八股文

什么是设计模式?

设计模式是软件开发过程中经常遇到的问题的通用解决方案类似于前人总结的经验,遇到相似问题的时候有个参考。

设计模式七大基本原则?

  • 单一职责:一个类应该只作一件事情。将功能分为小的独立的单元。
  • 开放封闭原则:对扩展开放,对修改关闭。
  • 里氏替换原则:任何一个父类出现的地方,都可以用子类替换,而不会导致错误或者异常。
  • 依赖倒置:高层模块不应该依赖于底层,应该依赖于抽象,实现解耦。
  • 接口隔离:一个类不应该强迫它的客户端依赖于它们不需要的方法,接口应该小而专注,不应该包含多余的方法。

责任链模式?

  • 一种行为型设计模式,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。
  • 请求沿着链传递,直到有对象处理为止。
  • 分为三个角色:
    • Handler:抽象处理者,定义了一个处理请求的接口或者抽象类,通常会包含一个指向链中下一个处理者的引用。
    • ConcreteHandler:具体处理者,实现抽象处理者的处理方法,如果能处理就处理,不能就转发给下一个。
    • client:客户端,创建处理链,并向链的第一个处理者对象提交请求。
  • 工作流程:
    • 客户端将请求发送给链上的第一个处理者对象
    • 接收到请求后是否能处理
      • 可以就处理
      • 不可以就转发给链上的下一个处理者
    • 过程重复
  • 场景:
    • 过滤器链
    • 日志记录
    • 异常处理
    • 认证授权
  • 优缺点:
    • 降低耦合度
  • 实际举例:
    • 比如在线商店,用户下单的时候需要
      • 检查订单信息是否完整
      • 检查商品库存是否充足
      • 检查用户余额是否充足
      • 确认订单,更新商品库存和用户余额
public interface OrderHandler{void handler(Order order);
}
public class CheckOrderHandler implements OrderHandler {private OrderHandler next;public CheckOrderHandler(OrderHandler next) {this.next = next;}@Overridepublic void hand1e(Order order) {
//检查订单信息是否完整if (order.isInfoComplete()) {
//如果订单信息完整,则将请求传递给下一个处理者next.handle(order);} else {
//如果订单信息不完整,则直接返回错误信息throw new RuntimeException("订 单信息不完整");}}public class CheckStockHandler implements OrderHandler {private OrderHandler next;public CheckStockHandler(OrderHandler next) {this.next = next;}@Overridepublic void hand1e(Order order) {
//检查商品库存是否充足.if (order.getStock() >= order.getQuantity()) {
//如果库存充足,则将请求传递给下一个处理者next.handle(order); } else {
//如果库存不足,则直接返回错误信息throw new RuntimeException(" 商品库存不足");}}}public class CheckBalanceHandler implements OrderHandler {private OrderHandler next;public CheckBalanceHandler(OrderHandler next) {this.next = next;}@Overridepublic void hand1e(Order order) {
//检查用户余额是否充足.if (order.getBalance() >= order.getAmount()) {
//如果余额充足,则将请求传递给下一个处理者.next.handle(order); } else {
//如果余额不足,则直接返回错误信息throw new RuntimeException("用户 余额不足");}}}public class ConfirmOrderHandler implements OrderHandler {@Overridepublic void handle(Order order) {
//确认订单,更新商品库存和用户余额order.confirm();}}
//客户端代码示例CheckOrderHandler checkOrderHandler = newCheckOrderHandler();CheckStockHandler checkStockHandler = new CheckStockHand1er();CheckBalanceHandler checkBalanceHandler = new CheckBalanceHandler();ConfirmOrderHandler confirmOrderHandler =newConfirmOrderHand1er();
//将处理器按照一定顺序组成责任链checkOrderHand1er.setNext(checkStockHandler);checkStockHand1er.setNext(checkBalanceHandler);checkBalanceHand1er.setNext(confirmOrderHandler);// 处理订单Order order = new Order();checkOrderHandler.handle(order);

工厂模式?

  • 创建型设计模式主要创建对现象,而不暴露对象的逻辑给客户端。
  • 简单工厂
    • 简单工厂模式的角色包括三个:

      • 抽象产品 角色

      • public abstract class Weapon {/*** 所有的武器都有攻击行为*/public abstract void attack();
        }
      • 具体产品角色

      • public class Tank extends Weapon{@Overridepublic void attack() {System.out.println("坦克开炮!");}
        }/*** 战斗机(具体产品角色)* @version 1.0* @className Fighter* @since 1.0**/
        public class Fighter extends Weapon{@Overridepublic void attack() {System.out.println("战斗机投下原子弹!");}
        }/*** 匕首(具体产品角色)* @version 1.0* @className Dagger* @since 1.0**/
        public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("砍他丫的!");}
        }
      • 工厂类 角色

      • public class WeaponFactory {/*** 根据不同的武器类型生产武器* @param weaponType 武器类型* @return 武器对象*/public static Weapon get(String weaponType){if (weaponType == null || weaponType.trim().length() == 0) {return null;}Weapon weapon = null;if ("TANK".equals(weaponType)) {weapon = new Tank();} else if ("FIGHTER".equals(weaponType)) {weapon = new Fighter();} else if ("DAGGER".equals(weaponType)) {weapon = new Dagger();} else {throw new RuntimeException("不支持该武器!");}return weapon;}
        }

        优点:不需要关注对象创建细节,要什么对象直接向工厂要就可以,初步实现了生产和消费的分离。缺点:工厂为上帝类,不能出问题;不符合OCP开闭原则,扩展时需要修改工厂类。

      • spring通过依赖注入和面向接口编程解决

  • 工厂方法
    • 工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

      工厂方法模式的角色包括:

      • 抽象工厂角色

      • 
        /*** 武器工厂接口(抽象工厂角色)* @author 动力节点* @version 1.0* @className WeaponFactory* @since 1.0**/
        public interface WeaponFactory {Weapon get();
        }
      • 具体工厂角色

      • /*** 具体工厂角色* @author 动力节点* @version 1.0* @className GunFactory* @since 1.0**/
        public class GunFactory implements WeaponFactory{@Overridepublic Weapon get() {return new Gun();}
        }
        package com.powernode.factory;/*** 具体工厂角色* @author 动力节点* @version 1.0* @className FighterFactory* @since 1.0**/
        public class FighterFactory implements WeaponFactory{@Overridepublic Weapon get() {return new Fighter();}
        }

      • 抽象产品角色

      • /*** 武器类(抽象产品角色)* @author 动力节点* @version 1.0* @className Weapon* @since 1.0**/
        public abstract class Weapon {/*** 所有武器都有攻击行为*/public abstract void attack();
        }
      • 具体产品角色

      • /*** 具体产品角色* @author 动力节点* @version 1.0* @className Gun* @since 1.0**/
        public class Gun extends Weapon{@Overridepublic void attack() {System.out.println("开枪射击!");}
        }
        package com.powernode.factory;/*** 具体产品角色* @author 动力节点* @version 1.0* @className Fighter* @since 1.0**/
        public class Fighter extends Weapon{@Overridepublic void attack() {System.out.println("战斗机发射核弹!");}
        }

        扩展时增加一个产品+工厂,缺点:类爆炸

  • 抽象工厂模式:

    • 抽象工厂中包含4个角色:

      • 抽象工厂角色

      • public abstract class AbstractFactory {public abstract Weapon getWeapon(String type);public abstract Fruit getFruit(String type);
        }
      • 具体工厂角色

      • public class WeaponFactory extends AbstractFactory{public Weapon getWeapon(String type){if (type == null || type.trim().length() == 0) {return null;}if ("Gun".equals(type)) {return new Gun();} else if ("Dagger".equals(type)) {return new Dagger();} else {throw new RuntimeException("无法生产该武器");}}@Overridepublic Fruit getFruit(String type) {return null;}
        }public class FruitFactory extends AbstractFactory{@Overridepublic Weapon getWeapon(String type) {return null;}public Fruit getFruit(String type){if (type == null || type.trim().length() == 0) {return null;}if ("Orange".equals(type)) {return new Orange();} else if ("Apple".equals(type)) {return new Apple();} else {throw new RuntimeException("我家果园不产这种水果");}}
        }
      • 抽象产品角色

      • 具体产品角色

      • public abstract class Weapon {public abstract void attack();
        }
        package com.powernode.product;public class Gun extends Weapon{@Overridepublic void attack() {System.out.println("开枪射击!");}
        }public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("砍丫的!");}
        }

        优点:能保证一个工厂只使用一个类型的

        • 缺点:不符合OCP、

单例模式?

见另一篇

策略模式和模板设计模式?

  • 策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法独立于使用它的客户而变化。
  • // 定义策略接口
    public interface PaymentStrategy {void pay(int amount);
    }// 具体策略类:信用卡支付
    public class CreditCardPaymentStrategy implements PaymentStrategy {private String cardNumber;public CreditCardPaymentStrategy(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using Credit Card: " + cardNumber);}
    }// 具体策略类:PayPal支付
    public class PayPalPaymentStrategy implements PaymentStrategy {private String email;public PayPalPaymentStrategy(String email) {this.email = email;}@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using PayPal: " + email);}
    }// 环境类:使用策略
    public class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(int amount) {paymentStrategy.pay(amount);}
    }// 客户端代码
    public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();// 使用信用卡支付cart.setPaymentStrategy(new CreditCardPaymentStrategy("1234-5678-9012-3456"));cart.checkout(100);// 使用PayPal支付cart.setPaymentStrategy(new PayPalPaymentStrategy("example@example.com"));cart.checkout(200);}
    }
    

  • 模板方法模式:
    • 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
    • // 抽象类,定义模板方法和抽象方法
      public abstract class Game {// 模板方法public final void play() {initialize();startPlay();endPlay();}protected abstract void initialize();protected abstract void startPlay();protected abstract void endPlay();
      }// 具体类:足球游戏
      public class Football extends Game {@Overrideprotected void initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overrideprotected void startPlay() {System.out.println("Football Game Started. Enjoy the game!");}@Overrideprotected void endPlay() {System.out.println("Football Game Finished!");}
      }// 具体类:篮球游戏
      public class Basketball extends Game {@Overrideprotected void initialize() {System.out.println("Basketball Game Initialized! Start playing.");}@Overrideprotected void startPlay() {System.out.println("Basketball Game Started. Enjoy the game!");}@Overrideprotected void endPlay() {System.out.println("Basketball Game Finished!");}
      }// 客户端代码
      public class Main {public static void main(String[] args) {Game game = new Football();game.play();game = new Basketball();game.play();}
      }
      
       结合:
    • // 定义支付策略接口
      public interface PaymentStrategy {void pay(int amount);
      }// 具体支付策略类:信用卡支付
      public class CreditCardPaymentStrategy implements PaymentStrategy {private String cardNumber;public CreditCardPaymentStrategy(String cardNumber) {this.cardNumber = cardNumber;}@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using Credit Card: " + cardNumber);}
      }// 具体支付策略类:PayPal支付
      public class PayPalPaymentStrategy implements PaymentStrategy {private String email;public PayPalPaymentStrategy(String email) {this.email = email;}@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using PayPal: " + email);}
      }
      
      // 抽象类,定义支付流程的模板方法
      public abstract class PaymentProcess {private PaymentStrategy paymentStrategy;public PaymentProcess(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 模板方法public final void processPayment(int amount) {selectItem();enterShippingDetails();if (confirmOrder()) {makePayment(amount);}sendReceipt();}protected void selectItem() {System.out.println("Item selected.");}protected void enterShippingDetails() {System.out.println("Shipping details entered.");}protected boolean confirmOrder() {System.out.println("Order confirmed.");return true;}protected void makePayment(int amount) {paymentStrategy.pay(amount);}protected void sendReceipt() {System.out.println("Receipt sent to customer.");}
      }// 具体的支付流程类可以根据需要进行扩展
      public class OnlineStorePaymentProcess extends PaymentProcess {public OnlineStorePaymentProcess(PaymentStrategy paymentStrategy) {super(paymentStrategy);}@Overrideprotected void selectItem() {System.out.println("Item selected from online store.");}@Overrideprotected void enterShippingDetails() {System.out.println("Online store shipping details entered.");}@Overrideprotected void sendReceipt() {System.out.println("Online store receipt sent to customer.");}
      }
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332182.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot3微服务下结合springsecurity的认证授权实现

1. 简介 在微服务架构中,系统被拆分成许多小型、独立的服务,每个服务负责一个功能模块。这种架构风格带来了一系列的优势,如服务的独立性、弹性、可伸缩性等。然而,它也带来了一些挑战,特别是在安全性方面。这时候就体…

来自Java的“菱形继承“,你听说过吗?

一、菱形继承的概念 菱形继承又叫做钻石继承,指的是不同的类同时继承自相同的父类,存在一个子类同时继承这些不同的类,即我们常说的“多继承”问题。 例如:B类和C类分别继承A类,而D类同时继承B类和C类。 如此图所示 二…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程,将重点讲解Phpsploit-Framework框架软件的基础使用! 本文章仅提供学习,切勿将其用于不法手段! 接上一篇文章内容,讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们,继续讲一…

Unity | 框架MVC

目录 一、MVC介绍 二、搭建UI界面 三、代码实现 1.Model层 2.View层 3.Controller层 四、MVC框架测试 五、知识补充 一、MVC介绍 model:数据层。界面展示的数据(需要进行初始化、更新、保存、事件通知等操作),单例模式&am…

React中显示数据

SX 会让你把标签放到 JavaScript 中。而大括号会让你 “回到” JavaScript 中&#xff0c;这样你就可以从你的代码中嵌入一些变量并展示给用户。例如&#xff0c;这将显示 user.name&#xff1a; return (<h1>{user.name}</h1> ); 你还可以将 JSX 属性 “转义到 …

宁夏银川、山东济南、中国最厉害的改名大师的老师颜廷利教授的前沿思想观点

在当代社会&#xff0c;一个响亮的声音穿越了传统的迷雾&#xff0c;它来自东方哲学的殿堂&#xff0c;由一位现代学者颜廷利教授所发出。他的话语&#xff0c;如同一股清泉&#xff0c;在混沌的世界里激荡着思考的波澜&#xff1a;"有‘智’不在年高&#xff0c;无‘智’…

嵌入式之音频基础知识

声音特性 1、响度&#xff1a;人主观上感觉声音的大小&#xff08;俗称音量&#xff09;&#xff0c;由“振幅”和人离声源的距离决定&#xff0c;振幅越大响度越大&#xff0c;人和声源的距离越小&#xff0c;响度越大&#xff1b; 2、音调&#xff1a;声音的高低&#xff0…

无人机反制:光电干扰一体设备技术详解

一、光电干扰技术原理 光电干扰技术是一种利用光学和电子技术手段对无人机实施干扰和控制的先进技术。该技术通过向无人机发射特定频率和强度的光信号或电磁信号&#xff0c;干扰无人机的视觉系统、控制系统或通信链路&#xff0c;进而达到反制无人机的目的。光电干扰技术具有…

world machine学习笔记(4)

选择设备&#xff1a; select acpect&#xff1a; heading&#xff1a;太阳的方向 elevation&#xff1a;太阳的高度 select colour&#xff1a;选择颜色 select convexity&#xff1a;选择突起&#xff08;曲率&#xff09; select height&#xff1a;选择高度 falloff&a…

neo4j开放远程连接

注&#xff1a;本博客所用neo4j版本为社区5.12版 第一步&#xff1a;修改neo4j配置文件 首先找到neo4j的安装位置&#xff0c;点击进入conf文件夹&#xff0c;随后点击neo4j.conf文件&#xff0c;在“Network connector configuration”下面的单元中找到server.default_liste…

7款好用到离谱的神级App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 转眼间&#xff0c;2024年已经是下个月。最近有很多小伙伴的咨询&#xff0c;我也赶紧整理了7款好用的软件&#xff0c;希望对大家有所帮助。 …

Elasticsearch 分析器(内置分析器,自定义分析器,IK分析器)

Elasticsearch 分析器&#xff08;内置分析器&#xff0c;自定义分析器&#xff0c;IK分析器&#xff09; 内置分析器使用分析器自定义分析器中文分析器&#xff08;IK分析器&#xff09;安装使用添加词典 内置分析器 官网&#xff1a;https://www.elastic.co/guide/en/elasti…

03_前端三大件CSS

文章目录 CSS用于页面元素美化1.CSS引入1.1style方式1.2写入head中&#xff0c;通过写style然后进行标签选择器加载样式1.3外部样式表 2.CSS样式选择器2.1 元素选择器2.2 id选择器2.3 class选择器 3.CSS布局相关3.1 CSS浮动背景&#xff1a;先设计一些盒子因此&#xff0c;引出…

【qt】QTreeWidget 树形组件

QTreeWidget 树形组件 一.什么是树形组件二.界面设计树形组件三.代码实现1.清空2.设置列数3.设置头标签4.添加根目录①QTreeWidgetitem②设置文本③设置图标④添加为顶层目录 5.添加子目录①初始化为父目录②子目录添加到父目录③获取到子目录 四.插入目录1.获取当前选中目录项…

python数据类型之元组、集合和字典

目录 0.三者主要作用 1.元组 元组特点 创建元组 元组解包 可变和不可变元素元组 2.集合 集合特点 创建集合 集合元素要求 集合方法 访问与修改 子集和超集 相等性判断 集合运算 不可变集合 3.字典 字典特点 字典创建和常见操作 字典内置方法 pprin模块 0.…

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

分享活动规划

前两天去参加菁英学院的一些辅导&#xff0c;是关于苏州久富农业机械的发展&#xff0c;看了他们企业的故事&#xff0c;我觉得我们农机很有前景和发展空间&#xff0c;我希望重新经过一次分享活动来分享我的感触&#xff0c;希望能够再次把我学到的内容传输到其他班的同学们 请…

word 全文中 英文字体 和 样式的字体 莫名奇妙地 被改成 “等线”

word全文中英文字体和样式的字体莫名奇妙地被改成“等线” sm word又抽风了&#xff0c;改完论文保存后打开突然发现全文字体都不对劲&#xff0c;吓得冷汗直冒&#xff1a;虽然我用git管理了论文版本&#xff0c;但是只有比较大的修改我才上传了&#xff0c;刚刚修了几个小时…

Redis篇 redis基本命令和定时器原理

基本命令和定时器原理 一. exists命令二. del命令三. Expire命令四. ttl命令五. redis的过期策略六. 定时器的两种设计方式七. type命令 一. exists命令 用来判断key的值是否存在 返回值是key的个数 这样写的话&#xff0c;有没有什么区别呢&#xff1f; 效率变低&#xff0c;消…