设计模式

一、设计原则
1、开闭原则--->对扩展开发,对修改关闭
2、单一职责原则--->一个方法只做一件事
3、依赖倒置原则--->通过接口是各个类之间解耦
4、接口隔离原则--->
5、迪米特原则--->一个类对其所依赖的类知道的越少越好。通过private、public
6、里式替换原则--->子类可以扩展父类的功能,不能改变父类原有的功能(本来就不能)
7、合成复用原则--->尽量使用对象的组合和聚合,而不是用继承

二、spring中的设计模式
1、工厂模式:BeanFactory
2、装饰器模式:BeanWwrapper
3、代理模式:AopProxy
4、单例模式:ApplicationContext
5、委派模式:DispatcherServlet
6、策略模式:HandlerMapping
7、适配器模式:HandlerAdapter
8、模板方法模式:JdbcTemplate

一、简单工程模式(Simple Factory Pattern)
1、由一个工厂对象决定穿件出哪种产品类的实例。

二、工厂方法模式(factory method pattern)
1、不同的工程创建不同的产品,不同的工厂同一个接口,不同的产品也同一个接口

三、抽象工厂模式(abstract factory pattern)
1、一个工厂可创建多种类型的产品,就是工厂方法的升级

四、单例模式(singleton pattern)
1、特点:私有化所有的构造方法、只有一个全局的访问点
2、spring的ApplicationContext
(一)、饿汉式单例
1、缺点:浪费内存空间
(二)、懒汉式单例
1、锁+双重判断
(三)、静态内部类(性能最优)
1、利用静态内部类使用的时候才加载
(四)、内部枚举
1、利用枚举的构造方法
2、 枚举最安全(jdk层面保证枚举不能被反射)

五、原型模式(prototype pattern)【对象的clone、与单例模式相反】
1、指原型实例指定创建对象的种类,并且通过copy这些原型创建新的对象。
2、调用者不需要知道任务创建细节,不调用构造函数
3、使用场景:
a、类初始化消耗资源较多
b、new产生一个对象需要非常繁琐的过程(数据准备、访问权限等)
c、构造行数比较复杂
d、循环体中产生大量对象
4、例如
a、BeanUtils.copy()
b、Json.parseObject()
c、Guava
d、spring中的scope="prototype"【简clone】
e、ArrayList.clone()【深clone】
5、有深克隆(用ObjectStream复制对象)和简克隆(直接复制引用)之分
a、spring为简clone
b、ArrayList为深clone

六、代理模式(proxy pattern)
1、指为其他对象提供一种代理,以控制对这个对象的访问
2、地理对象在客户端和目标对象之间弃掉了中介作用
3、数据结构型设计模式
(一)、静态代理
1、与装饰者模式相似
(二)、动态代理(jdk & cglib)
1、jdk过程:获取接口信息--->生成java文件--->通过JavaComplier生成class文件--->读取class文件到byte[]--->ClassLoder.defineClass(className, byte[])生成class对象--->class对象.newInstance()生成对象实例
2、jdk是实现了被代理对象的接口,cglib是继承了被代理对象,所以cglib无法代理final
3、jdk和cglib都是在运行期间生成字节码,jdk直接写class字节码,cglib使用asm框架写字节码,cglib代理实现更复杂,生成代理类比jdk效率低(cglib生成代理类和fastClass类,jdk只生成代理类)
4、jdk调用代理方法是通过反射机制,cglib是通过fastClass机制直接调用方法,cglib执行效率高
验证方式:
1、将生成代理类的字节码输出到文件
byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});
FileOutputStream os = new FileOutputStream("F:\\test-io\\proxy.class");
2、cglib字节码文件夹输出到f盘
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:\\test-io");

七、委派模式(delegate pattern)
1、精简程序逻辑,提升代码的可读性
2、负责任务的调度和分配,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但代理模式注重过程,而委派模式注重结果。
3、属于行为型模式。
4、例如:despatcherServlet ext HttpServlet中的service(HttpServletRequest req, HttpServletResponse resp)

八、策略模式(strategy pattern)
1、定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户
2、消除程序中大量的if-else、switch语句
3、使用场景:
a、假如系统中有很多类,而他们的区别仅仅在于他们的行为不同
b、一个系统需要动态地在集中算法中选择一种

九、模板模式(template pattern)
1、通常焦作模板方法模式(template method pattern)是指定义一个算法骨架,并允许子类为一个或者多个步骤提供实现。
2、模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
3、属于行为性设计模式
4、模板类用abstract修饰
适用场景:
a、一次性实现一个算法不变的部分,可变的行为留给子类实现。
b、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

十、适配器模式(adapter pattern)
1、指将一个类的接口转换成客户期望的另一个接口,使原本的几口不兼容的类可以一起工作。
2、属于结构型设计模式。
适用场景:
a、已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
b、适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同的厂家造成功能类似而接口不相同情况下的解决方案。
c、适配器最好再详细设计阶段不要考虑,而是在修改已投产的系统中考虑


十一、装饰者模式(decorator pattern)
1、用于扩展一个类的功能或给一个类添加附加职责
2、动态的给一个对象添加功能,这些功能可以再动态的撤销
3、一般以Wrapper结尾

十二、观察者模式(observer pattern)
1、定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会受到通知并更新。观察者模式有时也叫发布订阅模式。
2、属于行为型模式
3、jdk中:被观察者 ext Observable 并addObserver(观察者)、并在发送通知后setChanged()、notifyObservers(event)。
          观察者 impl Observer biang 并update(被观察者, event)、
          
          
十三、命令模式(command pattern)
1、对命令的封装,每一个命令都是一个操作,请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接收方。请求方只需要请求执行命令,不用关系命令是怎样被接收的,增氧被操作以及事后被执行...。
2.本质上就是,解耦命令请求与处理。
3、jdk中的Runnable相当于command


十四、spring中涉及到的设计模式

设计模式使用注意事项:
1、工厂类一般就是被设计为单例。如spring的ApplicationContext

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值