依据尚硅谷
设计模式的七大原则
1、单一职责
降低类的复杂度,职责要单一。一个类最好只有一个引起它变化的原因,否则考虑拆分。
2、接口隔离原则(其潜在的风险就是接口爆炸=)
接口要精简单一。一个接口的行为太多时,考虑拆分接口。
3、依赖倒置原则
高层不应该依赖低层,抽象不应该依赖细节。面向接口编程,细节交给实现类,而不是面向实现编程。
注意事项和细节
- 底层的模块尽量都要有抽象类或者是接口 , 或者两个都要有 , 使得程序更有缓冲的余地 , 模块的稳定性更好
- 变量的声明尽量是抽象类或者是接口 , 这样使得我们的变量引用和实际的对象之间 , 就存在一个缓冲层 , 有利于程序的扩展和优化
- 继承的时候遵循里氏替换原则
-
这里的依赖注入联合接口的运用:
-
package cn.luchen; interface MyTV { public void use(); } interface operational { public void open(); public void setMyTV(MyTV myTV); } public class DependencyPass { public static void main(String[] args) { MyLGTV myLGTV = new MyLGTV(); OperateMyTV operateMyTV = new OperateMyTV(); operateMyTV.setMyTV(myLGTV); operateMyTV.open(); } } class MyLGTV implements MyTV { @Override public void use() { System.out.println("我的LG电视正在打开!"); } } class OperateMyTV implements operational { MyTV myTV; @Override public void setMyTV(MyTV myTV) { this.myTV = myTV; } @Override public void open() { myTV.use(); } }
-
这里的意思就是 我的 operateMyTV 想要使用(依赖) MyLGTV, 但是因为依赖倒置的原则, 为了模块的稳定性所以我不能够直接在 operateMyTV 初始化 MyLGTV , 而是 operateMyTV 去使用 MyLGTV 的接口.
-
4、里氏替换原则
开闭原则的补充,子类继承父类,父类引用即可代表子类。合理使用继承 , 在适当的情况下可以使用 聚合 组合 依赖的方式来解决问题
或者, 子类尽量不要overwrite父类的方法 , 如果迫不得已要重写的话 , 可以将A类的基础方法放入Base中 , 然后A类B类去继承Base
5、开闭原则 OCP (核心)
对扩展开放(对提供方开放修改),对修改关闭(对使用方的代码不修改)。抽象约束,封装变化。有规律的抽象出框架,变化的部分由实现封装具体实现。
工具Base <–extends-- 工具s(修改或者是增加)
|
|
使用class<--------- Client
6、迪米特原则
不要跟陌生人说话,只跟朋友说话。朋友指,当前类、当前类创建的实例以及实例的成员. 对自己依赖的类知道的越少越好
也就是在局部变量里面不能出现 A a = new A();
就像Controller和Service一样 不要把业务逻辑写在Controller里面
7、合成复用原则
![](https://ae01.alicdn.com/kf/U5fa8723a3b664785a2865dbc5f431303D.jpg)
聚合复用原则,如果要跟陌生人说话,采用组合的方法与其他类建立联系。
采用继承复用时需遵守里氏替换原则。
聚合复用、里氏替换算是开闭原则的具体实现
设计原则的核心思想
- 找出应用中可能需要变化的地方 , 把它们独立出来 , 不要和哪些不需要变化的代码混合在一起
- 针对接口编程 , 而不是针对具体实现编程
- 为了交互对象之间的低耦合设计而努力
创建型(站在对象的角度-设计代码)
单例模 [重点]
适用对象: 工具类对象 , 数据源 , session工厂
所谓的单例设计模式 , 就是采取一定的方法保证整个软件系统中, 对于某一类只能存在一个对象实例, 并且该类只提供一个取得其对象的方法(静态方法)
推荐使用: 饿汉式 , 静态内部类方式 , 双重检查方式 , 枚举方式**
步骤:
- 构造器私有化 (防止使用new创建实例)
- 在该类的内部创建对象
- 向外暴露一个静态的公共方法. getInstance();
代码实现
-
饿汉式
-
静态变量
package cn.luchen.structuralFormula.Singleton; /** * 饿汉式(静态变量) * 优点: 写法简单 , 避免了线程同步的问题 * 缺点: 没有达到懒加载的效果 , 如果没有用过这个会造成内存的浪费 * 结论: 可以使用, 但是有可能会造成内存的浪费 * 什么时候会发生类装载: */ public class EagerManDemo_1 { public static void main(String[] args) { EagerSingleton1 instance = EagerSingleton1.getInstance(); EagerSingleton1 instance1 = EagerSingleton1.getInstance(); System.out.println(instance1.hashCode() + "+" + instance.hashCode());
-