Silentdoer

导航

常用的设计模式

总体来说设计模式分为三大类(23种):

创建型模式,共五种:工厂方法模式(还可以用简单工厂,特别是如果生产的是不同属性的同一类型对象而不是同一接口的不同实现类对象时简单工厂要方便)、抽象工厂模式、单例模式、建造者模式、原型模式。(一般说的工厂模式是指工厂方法模式)

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。

但是自己写代码里感觉真正会常用的是:1.单例模式;2.策略模式;3.观察者模式;4.责任链模式;5.适配器模式;6.装饰者模式;7.工厂方法模式;8模板方法模式;

9.迭代器模式(但是一般List都实现了IEnumerable接口);10.组合模式;11.代理模式;12.享元模式;13.命令模式;

还有生产者消费者模型也很常见;

【重要】设计模式最大的问题是怎么命名,如果要完全遵循设计模式,那么很多类的命名就不知该怎么命名了,到时候只能在原类名的基础上加1、2、3、4这样的后缀;

 

解释:

1.命令模式:其实就是key-value模式,比如程序里要获得营销文案,如果直接将文案写死肯定不行;那么就规定一个写死的Key它对应可变的文案,而这个Key就是一个具体的Command对象(如CtrlZCommand表示ctrl+z这个快捷键命令,但是具体执行什么操作就看value是什么),Value就是具体要执行的操作,一般是Command cmd = new CtrlZCommand(conctreteOprHandler);)

2.策略模式:这个很常用,但是要求不同的策略是解决同一个问题(比如将字符串压缩为字节流),它要求参数和返回值是一致的,压缩就是很典型的,定一个函数式接口参数是字符串(字节流也行,字符串也是要转换为字节流的),返回值是字节流,然后它有多个实现类分别对应不同的压缩算法;

3.代理模式:典型的就是RPC框架,比如WCF,客户端调用foo.getUsers()来获取存储在服务端的用户信息,但是其实foo是一个代理对象,getUsers()方法内部执行了通过网络请求从后端获取用户的这样一系列操作;不过是自己写代码的话好像还没碰到十分符合这种情况的业务;

4.享元模式:一般是这种场景出现,a对象有特定的M类对象(比如红色的M),b对象也是需要一个红色的M对象,且a和b对象对M对象都没有TX操作,那么a和b其实就可以共用一个红色的M对象(它和单例不同,因为还可以有绿色的M对象);

自己写的比较典型的就是String里的RestTemplate的每个对象都需要一个JSON解析器,当用到多个RestTemplate对象时(不同配置),但是它内部的gson是没有什么区别的,因此gson就可以用享元模式一个gson对象在不同的RestTemplate对象里共享;

5.适配器模式:最常见的就是将多方法接口适配为继承时不需要每个都重写的抽象类,还有就是将Runnable和一个V对象适配为一个Callable对象(实现Callable接口);

posted on 2018-12-28 11:06  Silentdoer  阅读(131)  评论(0编辑  收藏  举报