您现在的位置是:首页 >技术杂谈 >设计模式】引言-六大设计原则网站首页技术杂谈

设计模式】引言-六大设计原则

蜗牛^^O^ 2023-06-28 20:00:03
简介设计模式】引言-六大设计原则

单一职责

● 概念:仅有一个引起其变化的原因。
● 个人理解:一个类中应该是一组相关性很高的函数及数据的封装
主观性较强,和起名一样困难,一个方法放在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

迪米特原则(最少知道)

● 概念:一个软件实体应当尽可能少地与其他实体发生相互作用。
● 个人理解:低耦合。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。