设计模式—观察者模式

六大设计原则

单一职责原则

一个类只负责一个功能领域中的相应职责。高内聚、低耦合。

理解:不同的类具备不同的职责,各司其职。做系统设计是,如果发现有一个类拥有了两种职责,那么就要问一个问题:可以将这个类分成两个类吗?如果真的有必要,那就分开,千万不要让一个类干的事情太多。

开闭原则

对拓展开放,对修改关闭。不修改原有代码的情况下进行拓展。

理解:类、模块、函数,可以去扩展,但不要去修改。如果要修改代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能保证对整个架构不会产生任何影响,那就没必要搞的那么复杂,直接改这个类吧。

里氏代替原则

所有引用基类(父类)的地方必须能透明的使用其子类的对象。

理解:父类可被子类替换,但反之不一定成立。也就是说,代码中可以将父类全部替换为子类,程序不会出现异常,但反过来就不一定了。

依赖倒置原则

抽象不应该依赖于细节,细节应当依赖于抽象。

理解:高层模块不应该依赖于底层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。应该面向接口编程,不该面向实现类编程。面向实现类编程相当于就事论事,那是正向依赖;面向接口编程,相当于透过现象看本质,抓住事务的共性,那就是反向依赖,即依赖倒置。

接口隔离原则

接口拆分。当一个接口太大时,我们需要将它分割成一些更细小的接口。

理解:不要对外暴露没有实际意义的接口。也就是说,尽量保证接口的实用性。当需要对外暴露接口时,需要再三斟酌,若没必要对外提供就删了吧,因为一旦提供了就意味着,将来要多做一件事情,何苦给自己找事做呢。

迪米特法则

理解:减少依赖。一个软件实体应当尽可能少地与其他实体发生相互作用。

    /**
    * 创建订单
    */
  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.短信发送成功,自动监听到 ");
  }
}

 

目的:打开思维,拥有自己探索的能力

原文地址:https://www.cnblogs.com/shuideqing/p/13984990.html