• 设计模式—观察者模式


    六大设计原则

    单一职责原则

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

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

    开闭原则

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

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

    里氏代替原则

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

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

    依赖倒置原则

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

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

    接口隔离原则

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

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

    迪米特法则

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

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

     

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

  • 相关阅读:
    mysql初识(五) 统计与计算与时间
    mysql初识(四)添加/修改字段信息
    mysql初识(二) 基础的查询语句
    mysql初识(三)修改表结构
    mysql初识(一)基础属性篇
    在Ubuntu上安装Docker Engine
    使用PowerDesigner对NAME和COMMENT互相转换
    mysql 5.1.34
    debian7下安装eclipse
    让 Visio 2003/2007 同时开多个独立窗口
  • 原文地址:https://www.cnblogs.com/shuideqing/p/13984990.html
Copyright © 2020-2023  润新知