设计模式的六大原则是:
- 单一职责原则(Single Responsibility Principle,SRP):一个类或者模块只负责一个功能或者职责,这个职责应该尽可能的单一,这样可以提高类的复用性和可维护性。
- 开闭原则(Open Closed Principle,OCP):一个软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着当需求发生变化时,不应该修改原有的代码,而是通过扩展已有的代码来满足新的需求。
- 里氏替换原则(Liskov Substitution Principle,LSP):子类应该能够替换掉父类并且可以被客户端所使用,而不会影响程序的正确性。这个原则保证了代码的可维护性和扩展性。
- 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖具体实现细节,具体实现细节应该依赖抽象。这个原则体现了面向对象编程中的抽象和接口隔离的思想。
- 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上。这个原则保证了代码的灵活性和可维护性。
- 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解,不应该与其他对象直接通信。这个原则也称为最少知识原则(Least Knowledge Principle,LKP),可以避免类之间的耦合,提高代码的可维护性和可复用性。
策略模式
策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。
策略模式主要由这三个角色组成,环境角色(Context)、抽象策略角色(Strategy)和具体策略角色(ConcreteStrategy)。
- 环境角色(Context):持有一个策略类的引用,提供给客户端使用。
- 抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略角色(ConcreteStrategy):包装了相关的算法或行为。
策略模式优点:
- 扩展性好,可以在不修改对象结构的情况下,为新的算法进行添加新的类进行实现;
- 灵活性好,可以对算法进行自由切换;
策略模式缺点:
- 使用策略类变多,会增加系统的复杂度。;
- 客户端必须知道所有的策略类才能进行调用;
使用场景:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为; 一个系统需要动态地在几种算法中选择一种;
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现;
代理模式
代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。
代理模式一般有三种角色:
- 抽象(Subject)角色,该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。
- 代理(Proxy Subject)角色,也叫做委托类、代理类,该角色负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题对象,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
- 真实(Real Subject)角色:该角色也叫做被委托角色、被代理角色,是业务逻辑的具体执行者。
静态代理
静态代理:代理类在编译阶段生成,程序运行前就已经存在,在编译阶段将通知织入Java字节码中。
以租房为例,我们一般用租房软件、找中介或者找房东。这里的中介就是代理者。
动态代理
动态代理:代理类在程序运行时创建,在内存中临时生成一个代理对象,在运行期间对业务方法进行增强。
总结
- 静态代理,代理类需要自己编写代码写成。
- 动态代理,代理类通过 Proxy.newInstance() 方法生成。
- JDK实现的代理中不管是静态代理还是动态代理,代理与被代理者都要实现两样接口,它们的实质是面向接口编程。CGLib可以不需要接口。
- 动态代理通过 Proxy 动态生成 proxy class,但是它也指定了一个 InvocationHandler 的实现类。
工厂模式
简单工厂模式
简单工厂模式的定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。
由于只有一个工厂类,所以工厂类中创建的对象不能太多,否则工厂类的业务逻辑就太复杂了,其次由于工厂类封装了对象的创建过程,所以客户端应该不关心对象的创建。
适用场景:
(1)需要创建的对象较少。
(2)客户端不关心对象的创建过程。
工厂方法模式
工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。每个对象都有一个与之对应的工厂。
抽象工厂模式
抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。
适用场景:
(1)和工厂方法一样客户端不需要知道它所创建的对象的类。
(2)需要一组对象共同完成某种功能时。并且可能存在多组对象完成不同功能的情况。
(3)系统结构稳定,不会频繁的增加对象。(因为一旦增加就需要修改原有代码,不符合开闭原则)