吊打面试官----精华汇总之设计模式与重构

1.   说说几个常见的设计模式(23种设计模式)?
2.   设计一个工厂的包的时候会遵循哪些原则?
3.   列举一个使用了 Visitor/ Decorator模式的开源项目/库?
4.   如何实现一个单例?
5.   代理模式(动态代理)?
6.   单例模式(懒汉模式,恶汉模式,并发初始化如何解决, volatile与lock的使用)?
7.   JDK源码里面都有些什么让你印象深刻的设计模式使用,举例看看?

 

设计模式六大原则
1.开放封闭原则:对扩展开放,对修改封闭,意即程序拓展时不要动原有的代码
2.LSP原则:任何基类可以出现的地方,子类一定可以出现
3.依赖倒置原则:使用接口,依赖于抽象而不是具体
4.接口隔离原则:为了解耦,使用多个相互隔离的接口
5.迪米特法则:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.CRP法则:尽量使用合成/聚合的方式,而不是使用继承。

分类
1.创建型模式(在创建对象的过程中尽量隐藏创建细节,不直接使用new)
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2.结构型模式(主要关注类和对象的继承、组合)
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3.行为型模式(关注对象之间的通信)
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)

单例模式
单例模式就是在它的核心结构中只包含一个被称为单例类的特殊类,通过构造函数私有化和静态块以及提供对外访问的接口来实现.
饿汉模式:单例实例在类的加载中就被创建,不需要判断,安全。
懒汉模式:单例实例在第一次使用时就被创建,需要被判断,不安全。
应用场景:如果希望在系统中某个类的对象只存在一个,单例模式是最好的选择。

工厂模式:
工厂模式主要是为创建对象提供了接口。
应用场景如下:
(1):在编码时不能预见需要创建那种类的实例。
(2):系统不依赖于产品类的实例如何创建,组合和表达的细节

观察者模式:
观察者模式就是定义了对象间的一对多的依赖关系,当一个对象改变状态时,它的所有的依赖者都随之改变。
应用场景如下:
(1):对一个对象状态的更新,需要其他对象的同步更新,而且其他对象的数量动态可变
(2):对象仅仅需要把自己的更新通知给其他对象而不需要知道其他对象的细节。

迭代器模式:
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
应用场景如下:
当你需要访问一个聚集对象,而且不管这些对象是什么都需要要遍历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。

代理模式:
为其他对象提供代理来控制该对象的访问
应用场景:
Nginx的反向代理运行的就是代理模式

适配器模式:
将一类接口转换成客户希望的另外一个接口,Adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
应用场景:
别人开发的控件要用咱们的应用服务,这时候适配器模式就起作用了,让不兼容变为兼容。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 原始需求背景: * 网宿CDN要按月收取客户的服务费用,根据流量的大小、 * 服务的类型等,收取不同的费用,收费规则如下: * web应用:1000元/M * 流媒体应用:1000元/M*0.7 * 下载应用:1000元/M*0.5 * 月末打印报表时,要罗列每个用户每个频道的费用、客户总费用, * 还要打印该客户的重要性指数,重要性指数=网页流/100+下载流量/600; * * 需求变更场景: * 系统已经开发出来了,接下来,运维部门现在希望对系统做一点修改, * 首先,他们希望能够输出xml,这样可以被其它系统读取和处理,但是, * 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * 不久,成本中心又要求修改计费规则,于是我们必须同时修改xmlReport() * 和report(),并确保其一致性,当后续还要修改的时候,复制-黏贴的问题就 * 浮现出来了,这造成了潜在的威胁。 * 再后来,客服部门希望修改服务类型和用户重要性指数的计算规则, * 但还没决定怎么改,他们设想了几种方案,这些方案会影响用户的计费规则, * 程序必须再次同时修改xmlReport()和report(),随着各种规则变得越来越复杂, * 适当的修改点越 来越难找,不犯错误的机会越来越少。 * 现在,我们运用所学的OO原则和方法开始进行改写吧。 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值