软件设计模式总结

思维

  1. OO思维:谁拥有数据,谁拥有职责;告诉而不是询问;面向对象即每一个对象不仅拥有数据还要有行为,负责任;
  2. 数据都是private, 通过函数来获取数据、设置数据;方便改动
  3. 电脑主板,代码中留有插口,可扩展。
  4. 将变化分离,动态绑定,单一职责;防止类爆炸,提高灵活性,自由组合;

原则

模式

模式一  观察者模式

适用场景:一对多;(例如: 控制多个屏幕显示气象信息)

内容:控制者类中,存在一个list<oberver>容器,当消息改变时,直接遍历整个list进行广播即可。

模式二:适配器模式

适用场景: 在原有代码基础上包一层,将接口改成自己想要的形式,统一接口(例如:当不同屏幕厂商第三方API接口不统一时)

内容:对象形,即在adapter类中new 一个原始类的对象,函数实现借助这个对象进行。

模式三:职责链模式

适用场景:对于一个数据,按顺序经过多个处理单元时。例如:污水处理过程

内容:处理单元就可以提取成单独的类,且包含一个成员变量--处理单元。这样就连接在一起。

式四:简单工厂模式:只有一个工厂,生产多个产品,内部用if else 来判断

式五:工厂方法模式:每个工厂对应一种产品

式六:抽象工厂模式:一个工厂可能对象多种产品;

以上三者通常使用的是工厂方法模式,三者的核心思想都是:

创建和使用分离。

有必要吗?有!如果创建对象时,还伴随着复杂的初始化、配置等操作,如果有1000处创建对象,则需要重复1000次。造成代码冗余,而且代码变更时也需要修改1000个位置。

工厂方法就是将创建对象的操作封装。

式七:外观者模式Facade

使用场景:当客户需要的一个操作会涉及到ABC多个模块时,将所有的ABC模块操作封装成一个接口,便于使用。例如:前台,10086号码  等等

式七:适配器模式

使用场景:在原有代码基础上进行修改时,为了不改动原有代码;

          还可以使用:继承; 将要改动的操作封装成一个函数,加入到原有代码中。

模式八:代理模式

使用场景:需要在旧代码基础上扩展时,保证不改动旧代码;被代理类的功能有扩展或者阉割时

举例:中介就是一个典型的代理类。

业主:房子面积,户型,报价,底价;身份证,房产本;

中介:

客户:

功能阉割:即中介可以把房子面积等信息告诉客户,但是,底价是不可以轻易告诉客户的,必须判断客户有足够诚意购买时才可以告诉。

功能扩展:现在房子成交了,但是业主不会办理过户手续。中介可以拿到业主的房产本等信息代为办理。

代理模式和适配器模式的区别:

https://blog.csdn.net/hp_cpp/article/details/105185020

相同点:代理类和适配器类都包含一个被代理类或被适配类的实例

不同点:适配器类的接口和被适配器接口不同,但是功能相同;代理类和被代理类的接口相同,但是功能有阉割或者扩展;

为什么要使用代理模式:

为什么要使用代理模式 - 代码ok - 博客园

  1. 在被代理类的基础上进行功能扩展:如:增加新函数,新功能;
  2. 在被代理类的基础上进行功能阉割:如:某个函数内部增加判断机制进行filter;

  以上,很常用的场景是在别人旧代码上进行扩展时,使用代理模式可以不更改原有代码。

代理模式和适配器模式的问题:需要把被代理类或被适配类所有的函数都实现一遍。

式九:组合模式

使用场景:树状结构,例如:文件夹系统;四则运算

内容:以文件系统为例。定义一个父类file, 有两个子类:文件夹,文件。分别对应树中的节点和叶子节点。且文件夹类中包含一个容器,容器中是file类型的元素(可以是文件夹也可以是文件)。求大小函数:文件夹类中,是遍历file类型元素的容器,依次直行其求大小函数,并将结果累加;文件类中,直接返回文件大小即可。

四则运算同理,运算符号和数字分别是节点和叶子节点。只不过,运算符号不再含有容器了,而是根据容器中元素数量不同即几元运算符,构建不同的子类。运算符号和数字类都包含两个函数:tostring 和 value .

 组合模式和职责链模式的区别:职责链模式中,不同处理单元只是具体的业务内容不同,其主体流程都一致。因此存在一个单元父类,和多个单元子类。模板模式。单元父类中包含一个属性,即一个单元父类的实例。以此来构成链。

组合模式是树状结构,一个节点可能有3,4,5... 个子节点。职责链模式是链式结果,一个单元只有一个子单元。

式十、单利模式

使用场景:只需要创建一个实例;

方法一:多线程不安全

 

方法二:多线程安全,但是提前创建对象,浪费空间

 

方法三:线程安全,最佳选择

 

注意:注意多线程时,单例模式的写法;避免多个线程创建多个实例;

“单例模式的懒汉式创建多个对象的原因:

假如第一个线程进入if (testSingleton==null) {....}内部还未创建对象的时候被第二个线程抢占资源,然后第二个线程也进入了if (testSingleton==null) {....}内部,然后两个线程分别创建了一个对象,导致懒汉式的加载在多线程的应用场景会出现创建多个对象的情况。” 参考:https://blog.csdn.net/qq_40389276/article/details/100594225

式十一、策略模式

内容:A类中包含两个属性B类和C类。然后B类派生一些子类,C类派生一些子类。避免了模板模式的类爆炸。组合优于继承。将变化分离。单一原则。蜡笔和油笔的例子。

式十二、模板模式

内容:主流程确定,某些细节不同。父类确定流程,子类实现细节。容易类爆炸。

案例

案例1:Log

目的:电脑主板,可插拔;

重点:明确行为和数据统一,告诉而不是ask,oo 思想;--- 将输出格式和是否输出的判断filter 都放到 目的地类之中。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值