首页 > 其他分享 >初识常用的设计模式

初识常用的设计模式

时间:2023-07-20 16:11:48浏览次数:36  
标签:常用 原则 一个 扩展 模式 初识 设计模式 行为 装饰

一、什么是设计模式?

  定义:设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

 

二、设计原则

1.开闭原则:用抽象构建架构,用实现扩展细节

2.依赖倒置原则:高层模块不应该依赖于底层模块,二者都应该依赖其抽象

3.单一职责原则:单个接口或类不应该有多个职责,应该尽可能的划分职责,通过组合的方式,完成更为复杂的业务

4.接口隔离原则:一个接口不要包含过多的职责,应合理划分,跟单一职责原则相辅相成

典型场景:动物、人、鸟,人和鸟都会吃,人会走路,鸟会飞,应该把走路和飞这两个行为抽象成接口,通过组合的方式让人拥有走路的行为,让鸟拥有飞的行为。再细划分,人有多个走路姿势,鸟有多个飞行方式,可以分别继承走路和飞的抽象行为扩展其具体的行为
5.迪米特法则:也就最少知道原则,一个对象尽量让其它对象保持最少的了解

典型场景:我点外卖,我只关心外卖员,不关系具体的店。我的类中只依赖外卖员,不会依赖具体的店。是不是静态代理。
6.里氏替换原则:在引用父类的地方,都可以替换为其子类。从而可以实现子类间的动态切换。换句话说就是要有面向接口的编程思维。结合“开闭原则”,完美

7.合成复用原则:多用组合,少用继承

 

三、策略模式

     什么是策略模式?

    定义 一个类的行为或其算法可以在运行时更改。

   意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

   主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

   何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

   如何解决:将这些算法封装成一个一个的类,任意地替换。

   关键代码:实现同一个接口。

   应用实例:

                      1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

                      2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

                     3、支付方式,可以选择微信支付,支付宝支付,银联支付。

                     4、发奖逻辑    Object process = AwardPostProcessorFactory.getPostProcessor(奖品类型).process(奖品参数);

                     5、启用禁用                    

 public Boolean setStatus(BusinessStatusDTO dto){
AbstractCommonStrategy strategy = CommonStrategyFactory.getStrategy(dto.getBusinessType());
return strategy.setStatus(dto.getId(),dto.getStatus());
}

                  6、线程池设置拒绝策略

 

  优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

  缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

 使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

                   2、一个系统需要动态地在几种算法中选择一种。

                    3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

四、装饰者模式

     什么是装饰者模式?

定义:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。

                   2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承。

 

 

参考:http://www.360doc.com/content/18/0202/11/41075863_727138947.shtml

          https://www.runoob.com/design-pattern/design-pattern-tutorial.html

标签:常用,原则,一个,扩展,模式,初识,设计模式,行为,装饰
From: https://www.cnblogs.com/maohuidong/p/17568662.html

相关文章

  • 初识软件工程
     1、什么是软件工程软件工程是一门研究  用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴......
  • 初识线程池
    内容:  1、什么是线程池      2、线程池的优点      3、线程池原理(重点)      4、理解线程池(重点)      5、如何设置线程池 1、什么是线程池线程池(英语:threadpool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存......
  • linux系统,kafka常用命令
    kafka版本过高所致,2.2+=的版本,已经不需要依赖zookeeper来查看/创建topic,新版本使用--bootstrap-server替换老版本的--zookeeper-server。[root@kwephis1160698bin]#./kafka-topics.sh--list--zookeeperlocalhost:2181Exceptioninthread"main"joptsimple.Unrecognized......
  • Nginx常用配置
    一、基础配置userroot;worker_processes1;events{worker_connections10240;}http{log_format'$remote_addr-$remote_user[$time_local]''"$request"$......
  • docker常用命令
    dockeroperationcommand:查询镜像sudodockerimages删除镜像dockerrmibf756fb1ae65(镜像id)#启动镜像#sudodockerrun-it-d--nametest01ubuntu18.04:docker_test1/bin/sh创建macvlan网络sudodockernetworkcreate-dmacvlan--subnet=172.16.2.1/23--......
  • PGSQL_实操常用指南
    1、建表--定额配置主表--1、表不存在->创建--2、给注释CREATETABLEIFNOTEXISTSpublic.pro_salary_quota(idvarchar(50)NOTNULL,--主键Idworking_process_typeint4NOTNULL,--工序类型:1-构件工序,2-零件工序working_process_idvarch......
  • 设计模式全解(二)
    我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,我们看下面的图:6、适配器模式(Adapter) 适配器模式将某个类的接口转换成客......
  • mysql常用中间件
    实现MySQL常用中间件的流程步骤步骤描述步骤一安装和配置MySQL数据库步骤二下载和安装MySQL中间件步骤三配置中间件和数据库连接步骤四测试中间件连接和功能步骤一:安装和配置MySQL数据库在开始实现MySQL常用中间件之前,首先需要安装和配置MySQL数据库......
  • 6大常用基础算法
    6大常用基础算法1冒泡排序(BubbleSort)基本思想两个数比较大小,比较大的数下沉,比较小的数冒起来。时间复杂度O(n)2代码```inta[]={15,4,3,2,8,0,7};intlength=sizeof(a)/size(a[0]);voidasd(inta[],intlength){inttemp;for(inti=0;i<length-1;i++){......
  • linux(麒麟)常用命令
    1、查看设备名称ls-l/dev/tty*  2、修改文件权限a、直接将此文件改为所有用户可读写chmod777/opt/1.txtr:读数字4w:写数字2x:写数字1可用数字快速表示,如,就是可读,可写,可执行就是4+2+1=7‘777’就表示拥有者,归属组,其他人都可读,可写,可执行。000反之。 b、修......