您现在的位置是:首页 >技术杂谈 >设计模式】引言-六大设计原则网站首页技术杂谈
设计模式】引言-六大设计原则
简介设计模式】引言-六大设计原则
单一职责
● 概念:仅有一个引起其变化的原因。
● 个人理解:一个类中应该是一组相关性很高的函数及数据的封装
主观性较强,和起名一样困难,一个方法放在ClassA合理还是放在ClassB合理?
开闭原则
● 概念:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
● 个人理解:设计模式主要目的之一,就是为了减少耦合,使程序更加容易扩展。
实例
AbstractQueuedSynchronizer的设计,队列同步器的实现及其复杂,但主要流程一致,区别只在于tryAcquire和tryRelease时对同步状态值(state)的判断与处理,所以可以利用模版模式将差异的部分进行抽象,子类根据自身的功能需求来实现。JUC中的各种同步器基本上都是对于AbstractQueuedSynchronizer的扩展,一方面没有破坏对同步队列复杂操作的封装,一方面完成了扩展。
里氏替换法则
● 概念:所有引用基类(父类)的地方必须能透明地使用其子类的对象。
● 个人理解:基于Java的继承机制和多态特性,在加上Java强类型的限制,通常都可以在父类出现的地方合理使用其子类。
实例
在日常编程中随处可见,如呼吸般自然,随便一个例子:
void sort(List l){
// 排序
}
public static void main(String[] args){
sort(new ArrayList());
}
依赖倒置
● 概念:抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程
● 个人理解:面向接口编程,通过替换接口的实现(具体依赖)改变行为,实现灵活扩展
实例
package principle;
public class DIPtest {
public static void main(String[] args) {
Customer wang = new Customer();
System.out.println("顾客购买以下商品:");
wang.shopping(new ShaoguanShop());
wang.shopping(new WuyuanShop());
}
}
//商店
interface Shop {
public String sell(); //卖
}
//韶关网店
class ShaoguanShop implements Shop {
public String sell() {
return "韶关土特产:香菇、木耳……";
}
}
//婺源网店
class WuyuanShop implements Shop {
public String sell() {
return "婺源土特产:绿茶、酒糟鱼……";
}
}
//顾客
class Customer {
public void shopping(Shop shop) {
//购物
System.out.println(shop.sell());
}
}
接口隔离
● 概念:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
● 个人理解:接口的抽取要满足单一职责(特性)。
实例
public static void main(String[] args) {
List<Integer> list=new LinkedList<>(); // 集合
Deque<Integer> queue=new LinkedList<>(); // 队列
}
LinkedList的接口实现方式
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
迪米特原则(最少知道)
● 概念:一个软件实体应当尽可能少地与其他实体发生相互作用。
● 个人理解:低耦合。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。