软件构造设计模式理解——五种模式

软件构造设计模式理解——五种模式

星海拾遗

一、Factory Method(工厂方法)

工厂方法属于一种创建型模式(注:这种分类来自

https://blog.csdn.net/weixin_44200948/article/details/107298620

,分类很清晰),顾名思义,把要使用的类比作“产品”,把创建这个产品类的方法封装到另一个类中,把另一个类比作“工厂”,之后可以创建“工厂”来生产“产品”。

目的

使客户类代码中不包含具体的创建操作。
因为创建操作必须使用对应的类名,如果在项目上线后该类需要修改,那么将不得不改客户端代码,不符合OCP(Open-Closed Principle)原则。

设计思路

额外定义一个工厂接口,并在子工厂中具体实现创建工作(实例化),在客户类,只需要知道对应的工厂类名和创建方法名就能使用对应产品(类)。

二、Decorator(装饰器)

装饰器模式本质上是对结构进行重组。

目的

简化功能组合。
先假设一种情景,一个接口下有n个同级子类实现不同方法,当想要同时使用多个子类中的方法时,按照开闭原则(OCP),应该为这种情况重写一个子类,对编写者来说,这不复杂,只需要ctrl+c/v已有类中的方法,但这种思路有一个致命的问题,当需要所有的功能组合时,由组合数之和可知为2^{n}个子类,这显然会造成子类数目爆炸式增长。

设计思路

首先想象一颗这样的继承树,在接口下,有具体实现类,同级创建一个装饰类,而要附加的功能类继承装饰类,最巧妙的地方在于,装饰类中会传入对象并保存,而功能类中覆盖传入对象的方法,而子类可以完全替代父类,因此,当想要使用多个功能类的功能时,不需要重写一个新类,通过将一个功能类对象作为参数传入另一个功能类对象的方式可以实现功能类的嵌套,层层嵌套可以支持随意数目的功能叠加。(具体的例子见-Java设计模式之装饰器模式(Decorator Pattern)

https://blog.csdn.net/weixin_44848573/article/details/105916651?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168269092716800180681701%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168269092716800180681701&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-105916651-null-null.142v86insert_down1,239v2insert_chatgpt&utm_term=%E8%A3%85%E9%A5%B0%E5%99%A8%E6%A8%A1%E5%BC%8Fjava&spm=1018.2226.3001.4187

三、Strategy Pattern(策略模式)

策略模式类似于一个程序框中有下拉选项,而用户需要做的就是从中选一个

目的

想通过一个接口实现不同算法的切换

设计思路

对不断变化的部分单独构建一个继承树,而两颗继承树之间接口是委派关系(delegate),这样使用时,传入不同的参数(具体的子类),会实现不同的功能(子类进行具体实现)。

四、Template Method(模板方法)

只是一个简单的继承树,父类中写所有的共性算法,而子类可以重写父类方法来实现差异性。

目的

有共性的不同算法把共性部分提取出来,减少无意义的工作量。

设计思路

重点在提取不同算法的共性

五、Visitor Pattern(访问者模式)

表示一个作用与对象结构中各个元素的操作。可以使你不改变原始类的情况下增加对这些元素的新操作。(该说法较抽象,建议直接看设计思路)

目的

为未来可能的拓展留出接口

设计思路

额外建立一个Visitor类继承树,而该类只有缺省方法,在已有的类中留出传参的接口(指一个接受访客的方法——acceptVisitor(),只实现传入参数,并保存参数)。当对已有的类突然有修改的需求,但是不想修改原类,就可以写一个Visitor的子类,在该子类中写具体的方法,调用原类的acceptVisitor方法,传入新写的子类,就可以调用拓展的方法。
下图很清晰的展示了怎样留这种接口

https://blog.csdn.net/qq_36566262/article/details/124366832?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%AE%BF%E9%97%AE%E8%80%85%E6%A8%A1%E5%BC%8F&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-124366832.nonecase&spm=1018.2226.3001.4187

引用自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值