软件设计的总原则:高内聚,低耦合!
设计模式六大原则:
1、单一职责原则(SRP:Single responsiblity principle),
定义:一个类,只有一个引起它变化的原因。一个类只负责一项职责。
目的:其核心就是控制类的粒度大小、将对象解耦、提高其内聚性。
2、开闭原则
定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
目的:为了使程序的扩展性好,易于维护和升级。
3、里氏替换原则(Liskov Substitution Principle LSP),主要阐述了有关继承的一些原则;
定义:里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。通俗的说:子类可以扩展父类的功能,但不能改变父类原有的功能。
目的:复用父类,只扩展不修改。
4、依赖倒置原则(Dependence Inversion Principle),
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
目的:降低了客户与实现模块之间的耦合;
举例:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。
5、接口隔离原则
定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
目的:为了约束接口、降低类对接口的依赖性;
说明:一个类不应该依赖它不需要的接口。接口应该拆分为更小、更具体的接口,这样使用接口的实现类就只需实现自己需要的接口方法,而不需要实现其他不需要的方法。
举例:如果接口A有5个方法,继承类B只实现其中1、2,继承类C只实现其中3、4、5,这样不合适,应该定义接口D有1、2,接口E有3、4、5方法。
6、迪米特法则(最小知道原则)(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle)
定义:一个对象应该对其他对象保持最少的了解
目的:要求限制软件实体之间通信的宽度和深度。
说明:一个类不应该知道其他类太多的信息,它们之间应该保持最少的耦合。另外,一个类对外只公开它需要公开的方法,而不是所有的方法和属性。这一原则有助于使程序结构清晰,便于维护和扩展。
举例:B类使用A类的方法1,而又调用了A的实现类C的方法1或其它细节,B类只需要耦合A类中的抽象不要依赖过多的实现细节,致使A类扩展要修改B类。
使用该原则的设计模式:门面模式(Facade)和中介模式(Mediator)
二十三种设计模式
创建型模式,5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构模式,7种:适配器模式、装饰器模式、代理模式、外观械、桥接模式、组盒模式、享元模式。
行为模式,11种:策略模式、模板方法模式、观察者模式,迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
桥接模式:
定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
举例:手机-软件
场景:
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
优点:(1)在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它极大减少了子类的个数。(2)桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。
缺点:桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。