设计模式中用到的规则

1、单一职责原则( SRP:Single responsibility principle又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。此原则的核心就是 解耦 和增强 内聚性 。将不同的职责封装到不同的类或模块中。
2、开闭原则(OCP: Open Closed Principle )是 面向对象设计 中“可复用设计”的基石,是面向对象 设计 中最重要的原则之一。对于扩展是开放的,对于修改是关闭的。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。对模块行为进行扩展时,不必改动模块的源代码。实现开闭原则的关键就在于“抽象”。
在设计之初,要非常清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么情况下使用开闭原则。在开发过程中,就要知道可能的变化,将这些需要频繁变化部分进行抽象。查明可变化的等待时间越长,创建正确的抽象就约困难。
在实际开发过程的设计开始阶段,罗列出系统所有可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去做也是不经济的。应该现实的接受修改,使代码可以对扩展开放,对修改关闭。
3 接口隔离原则 (ISP:Interface Segregation Principle)使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。
4、 里氏替换原则 (LSP:Liskov Substitution Principle)面向对象设计的基本原则之一。 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。 
5、 依赖倒置原则 (DIP:Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
两种表述:
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
6、迪米特法则(最少知道原则)(LoP:Law of Demeter)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
7、合成复用原则(CRP:Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
### Spring 框架中应用的设计模式 #### 单例模式 (Singleton Pattern) 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在Spring框架里,Bean默认情况下是以单例形式存在的[^1]。 ```java @Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } } ``` 此配置下`MyService` Bean在整个应用程序上下文中只会有一个实例存在。 #### 工厂模式 (Factory Pattern) 工厂模式用于创建对象而无需暴露创建逻辑。Spring通过其IoC容器实现了这一模式,允许开发者声明性地定义如何构建bean而不是程序性地编写代码来完成同样的工作[^3]。 ```xml <beans> <bean id="service" class="com.example.MyServiceImpl"/> </beans> ``` 上述XML片段展示了如何利用Spring的工厂机制注册服务组件。 #### 观察者模式 (Observer Pattern) 观察者模式定义了一种一对多的关系依赖关系,当一个对象状态发生改变时所有依赖于它的对象都会得到通知并自动更新。Spring事件驱动模型正是基于这种模式实现的,使得不同模块之间能够松散耦合地交互数据或消息传递[^4]。 ```java @Async @EventListener public void handleEvent(MyCustomEvent event) { System.out.println("Received custom event: " + event); } ``` 这段代码展示了一个异步监听自定义事件的例子。 #### 责任链模式 (Chain of Responsibility Pattern) 责任链模式让多个处理器有机会处理请求而不必事先指定接收者。这在Spring MVC中的过滤器和拦截器中有很好的体现;它们按特定顺序执行,并可选择是否继续调用下一个成员直至最终目标被触发[^5]。 ```java @Component public class LoggingInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // Log the incoming HTTP Request details here... return true; // Continue with next interceptor or controller method. } ... } ``` 以上例子说明了怎样设置日志记录拦截器作为责任链条的一部分。 #### 模板方法模式 (Template Method Pattern) 模板方法模式在一个抽象基类中定义算法骨架,但将某些步骤延迟到子类去实现。Spring事务管理API就运用到了这一点——它规定了一些通用的操作流程(比如开启/提交/回滚),具体细节则留给使用者决定。 ```java @Transactional(propagation = Propagation.REQUIRED) public void updateOrder(Order order){ // Business logic goes here... } ``` 在这个场景里,`updateOrder()` 方法遵循由 `@Transactional` 注解所设定好的事务边界规则来进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值