OOP七大原则:
- 开闭原则:对扩展开房,对修改关闭。
- 里氏替换原则:继承必须确保超类所拥有的的性质在子类中任然成立。
- 依赖倒置原则:要面向接口编程,不要面向实现编程。
- 单一职责原则:控制类的粒度大小,将对象解耦,提高其内聚性。
- 接口隔离原则:要为各个类建立专用接口,不要试图建立一个庞大的接口提供所有依赖它的类去调用。
- 迪米特法则:只与你的直接朋友交谈,不跟“陌生人”说话。
- 合成复用原则:软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。
设计模式三大类
- 创建型模式
创建对象同时隐藏创建逻辑的方式 - 结构型模式
这些模式关注类和对象的组合 - 行为型模式
这些模式关注对象之间的通信
创建型模式
工厂模式(Factory )
简单工厂模式 (Simple Factory)✔
在这个模式下,有三个角色,抽象的产品,具体的产品和工厂,工厂对外,客户只需要到工厂提供相应的“订单”即刻提取相应的产品,对产品的实例化过程并不关心。
工厂可以根据参数返回对应的类,将实例化类的过程进行了抽象。
优点是实现了对象的创建和对象的使用的分离,最大的缺点是当产品过多,工厂的代码会变得非常复杂。不符合开闭原则。
工厂方法模式(Factory Method)✔
由父类工厂负责定义创建商品的接口,由对应的子工厂生产对应的商品,即是每个工厂只生产对应类的商品。比起简单工厂模式更加符合开闭原则。
工厂类不再生产,又其子类进行生产,克服了简单工厂模式的缺点。不过缺点是添加新产品的同时还需要提供对应的生产工厂类,增加了系统复杂度。
抽象工厂模式(Abstract Factory)✔
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
抽象出创建工厂的方法,提供多种产品等级的创建接口。
建造者模式(Builder)
犹如创造一辆车,车的零件相当于对象的属性,在一些螺丝钉设置的先后顺序,用户不需要关心细节,只需要调用”建造者“,建造者返回一个建造完毕的对象。
在该模式中,引入了Director,隔离了客户端和生产过程,建造者内部由Director负责组装,返回对应的对象。
单例模型(Singleton)
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。
一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
原型模式(Prototype)✔
在一个对象的创建需要较大的系统开销,譬如大量或者高代价的数据库操作才被创建,我们可以先缓存该对象,在下一个请求的时候返回这个对象的克隆体,减少系统开销。
结构型模式
适配器模式(Adapter)
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
桥接模式(Bridge)
桥接模式通常是为了抽象化和实例化进行解耦,将继承关系转换为关联关系,降低了类与类之间的耦合,减少了代码编写量。
(持续更新)
Abstraction:抽象类(桥接类)
RefinedAbstraction:扩充抽象类(继承抽象类)
Implementor:实现类接口
ConcreteImplementor:具体实现类
优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。
缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
装饰器模式(Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
举例:孙悟空变蜜蜂,本身还是孙悟空,蜜蜂是装饰器,让孙悟空有了蜜蜂的功能。
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
外观模式(Facade)
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
Facade:外观类(为子系统提供统一接口)
SystemX:子系统
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
代理模式(Proxy)
给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
Proxy:代理类
Subject:抽象类
RealSubject:具体类
通过代理来对具体类操作,这样做的好处有可以对具体类操作的过程进行一些限制(安全控制),或者是具体类开销比较大,可以在具体类执行前,通过开销小的代理类进行快速响应。
行为型模式
命令模式(Command)
是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
观察者模式(Observer)
中介模式(Mediator)
参考资料
Graphic Design Patterns:https://design-patterns.readthedocs.io/zh_CN/latest/
https://www.runoob.com/design-pattern
尚硅谷视频学习:https://www.bilibili.com/video/BV1G4411c7N4?p=1