设计模式—观察者模式
单一职责原则
一个类只负责一个功能领域中的相应职责。高内聚、低耦合。
理解:不同的类具备不同的职责,各司其职。做系统设计是,如果发现有一个类拥有了两种职责,那么就要问一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分开,千万不要让一个类干的事情太多。
开闭原则
对拓展开放,对修改关闭。不修改原有代码的情况下进行拓展。
理解:类、模块、函数,可以去扩展,但不要去修改。如果要修改代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能保证对整个架构不会产生任何影响,那就没必要搞的那么复杂,直接改这个类吧。
里氏代替原则
所有引用基类(父类)的地方必须能透明的使用其子类的对象。
理解:父类可被子类替换,但反之不一定成立。也就是说,代码中可以将父类全部替换为子类,程序不会出现异常,但反过来就不一定了。
依赖倒置原则
抽象不应该依赖于细节,细节应当依赖于抽象。
理解:高层模块不应该依赖于底层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。应该面向接口编程,不该面向实现类编程。面向实现类编程相当于就事论事,那是正向依赖;面向接口编程,相当于透过现象看本质,抓住事务的共性,那就是反向依赖,即依赖倒置。
接口隔离原则
接口拆分。当一个接口太大时,我们需要将它分割成一些更细小的接口。
理解:不要对外暴露没有实际意义的接口。也就是说,尽量保证接口的实用性。当需要对外暴露接口时,需要再三斟酌,若没必要对外提供就删了吧,因为一旦提供了就意味着,将来要多做一件事情,何苦给自己找事做呢。
迪米特法则
理解:减少依赖。一个软件实体应当尽可能少地与其他实体发生相互作用。
/**
* 创建订单
*/
public void saveOrder(){
//不符合 单一职责--里面包含了发短信,微信等
// 不符合 开闭原则 如增加4.记录日志,不小心改错了
//1.创建订单
System.out.println("1.订单创建成功");
//2.发送短信
System.out.println("2.发送短信成功");
//3.发送微信
System.out.println("3.发送微信");
//4.记录日志
System.out.println("4.记录日志");
}
设计原则:一把尺子
不是特别娴熟:功能开发阶段,不要去考虑太多代码设计。
利用设计原则,作为衡量代码好坏的尺子。再选择合适的设计模式对代码进行设计。
学习spring的源码设计
1.写增删改查的时候如何实现的
观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并且被自动更新。
又称:发布/订阅、消息通知机制、事件监听、事件驱动编程
利用观察者模式设计高拓展性的代码,利用Spring事件机制改造订单功能。
1.创建订单事件
/**
* 订单创建对象 事件
*/
public class OrderEvent extends ApplicationContextEvent {
/**
* Create a new ContextStartedEvent.
*
* @param source the {@code ApplicationContext} that the event is raised for
* (must not be {@code null})
*/
public OrderEvent(ApplicationContext source) {
super(source);
}
}
2.修改创建订单代码,去掉发送短信,微信这些功能,创建订单之后,发布一个订单事件。
@Service
public class OrderService {
@Autowired
ApplicationContext applicationContext;
/**
* 创建订单
*/
public void saveOrder(){
//不符合 单一职责--里面包含了发短信,微信等
// 不符合 开闭原则 如增加4.记录日志,不小心改错了
//1.创建订单
System.out.println("1.订单创建成功");
//利用spring的事件机制 --实现业务拓展-- 发布事件
applicationContext.publishEvent(new OrderEvent(applicationContext));
//以下功能不在这里编写
//1.创建一个事件
// //2.发送短信
// System.out.println("2.发送短信成功");
//
// //3.发送微信
// System.out.println("3.发送微信");
//
// //4.记录日志
// System.out.println("4.记录日志");
}
}
3.监听订单事件
@Component //交给spring托管 对象创建 保存
public class SmsListener implements ApplicationListener<OrderEvent> {
@Override //spring触发
public void onApplicationEvent(OrderEvent event) {
System.out.println("2.短信发送成功,自动监听到 ");
}
}
目的:打开思维,拥有自己探索的能力