`
zk11231002
  • 浏览: 887 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

设计模式实战

阅读更多

设计模式实战

概念

什么是设计模式

    代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

 

使用设计模式的目的:

   代码复用、增加代码可维护性的目的、代码风格优雅。

 

OOD七大原

 

   面向对象设计(Object-Oriented Design,OOD)有七大原则。

开-闭原则

 

Open-Close Principle(OCP),即开-闭原则。开,指的是对扩展开放,即要支持方便地扩展;闭,指的是对修改关闭,即要严格限制对已有内容的修改。开-闭原则是最抽象也是最重要的OOD原则。

 

里氏替换原则

 

Liskov Substitution Principle(LSP),即里氏替换原则。该原则规定“子类必须能够替换其父类,否则不应当设计为其子类”。换句话说,父类出现的地方,都应该能由其子类代替。所以,子类只能去扩展基类,而不是隐藏或者覆盖基类。

 

依赖倒置原则

 

Dependence Inversion Principle(DIP),依赖倒置原则。它讲的是“设计和实现要依赖于抽象而非具体”。一方面抽象化更符合人的思维习惯;另一方面,根据里氏替换原则,可以很容易将原则的抽象替换为扩展后的具体,这样可以很好的支持开-闭原则。

 

接口隔离原则

 

Interface Segration Principle(ISP),接口隔离原则,“将大的接口打散成多个小的独立的接口”。由于Java类支持实现多个接口,可以很容易的让类具有多种接口的特征,同时每个类可以选择性地只实现目标接口。

 

单一职责原则

 

Single Responsibility Principle(SRP),单一职责原则。它讲的是,不要存在多于一个导致类变更的原因,是高内聚低耦合的一个体现。

 

迪米特法则/最少知道原则

 

Law of Demeter or Least Knowledge Principle(LoD or LKP),迪米特法则或最少知道原则。它讲的是“一个对象就尽可能少的去了解其它对象”,从而实现松耦合。如果一个类的职责过多,由于多个职责耦合在了一起,任何一个职责的变更都可能引起其它职责的问题,严重影响了代码的可维护性和可重用性。

 

合成/聚合复用原则

 

Composite/Aggregate Reuse Principle(CARP / CRP),合成/聚合复用原则。如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么应当尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要再重新创建。新对象可通过向这些对象的委派达到复用已有功能的效果。简而言之,要尽量使用合成/聚合,而非使用继承。《Java设计模式(九) 桥接模式》中介绍的桥接模式即是对这一原则的典型应用。

 

模式分类:

创建型:工厂方法、抽象工厂、单例、建造者、原型

结构型:适配器、装饰器、代理、外观、桥接、组合、享元

行为型:策略、模版方法、观察者、迭代、责任链、命令模式、状态、访问者、中介者、解释器

 

实战

代理模式(proxy)

 

 

1、RealSubject 是委托类,Proxy 是代理类;
2、Subject 是委托类和代理类的接口;
3、request() 是委托类和代理类的共同方法;

 

项目中典型事例

    在自贩机的支付工程,我们就使用此模式,废话不多少说了直接上代码

Proxy:

public class PaymentProxy {
    @Autowired
    private PaymentServiceFacade paymentServiceFacade;
    @RequestMapping(value="/pay")
    public void pay(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String payPlatform = request.getParameter("payPlatform");
        paymentServiceFacade.proxy(payPlatform).pay(request,response);
    }
    @RequestMapping(value="/notify",method = RequestMethod.POST)
    public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String payPlatform = request.getParameter("payPlatform")==null?"tenpay":request.getParameter("payPlatform");
        paymentServiceFacade.proxy(payPlatform).notify(request,response);
    }
    @RequestMapping(value="/confirmPay",method = RequestMethod.POST)
    public void confirmPay(String payPlatform ,String out_trade_no,int timeout ) throws Exception {
        paymentServiceFacade.proxy(payPlatform).confirmPay(out_trade_no,System.currentTimeMillis()+timeout*60*1000);
    }
    @RequestMapping(value="/refund",method = RequestMethod.POST)
    public void refund(HttpServletRequest request, HttpServletResponse response ) throws Exception {
        String payPlatform = request.getParameter("payPlatform");
        paymentServiceFacade.proxy(payPlatform).refund(request,response);
    }
}

 

Subject:

public interface PaymentService {
    /**
     * 支付
     * @param request
     * @param response
     */
    void pay(HttpServletRequest request, HttpServletResponse response) throws Exception;

    /**
     * 接受第三方支付结果
     * @param request
     * @param response
     */
    void notify(HttpServletRequest request, HttpServletResponse response) throws Exception;

    /**
     * 退款
     * @param request
     * @param response
     * @throws Exception
     */
    void refund(HttpServletRequest request, HttpServletResponse response) throws Exception;
    /**
     * 确认订单状态(主动轮询第三方平台查询结果)
     * @param out_trade_no 订单号
     * @param stopDatetime 超过此时间后不再查询结果
     */
    void confirmPay(String out_trade_no, long stopDatetime) throws Exception;

}

RealSubject :



 

 

 

 

 

建造者模式(builder)



 

建造者模式通常包括下面几个角色:

1. builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

2. ConcreteBuilder:实现Builder接口,针对不同的商业逻辑,具体化复杂对象的各部分的创建。 在建造过程完成后,提供产品的实例。

3. Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

4. Product:要创建的复杂对象。

 

项目中典型事例:

mybatis的反向生产的查询条件建造者类,比如表名为:vem_file的一张表,会生成VemFileExample,GeneratedCriteria,Criteria。上图中Director(指挥者)对应的就是VemFileExample类,Builder对应的是GeneratedCriteria,ConcreteBuilder对应的是Criteria。

 

 

使用场景

    创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

 

 

观察者模式:



 

从类图中我们可以看到,观察者的内容能够获得较快的更新的原因是因为被观察者在数据有修改的时候去及时通知所有的观察者了

 

项目中典型事例:

    例如自贩机系统,自贩机会定时上报故障和机器的状态指标,这些指标就是被观察者(Subject),现在有几种告警手段:短信、邮件、微信(这些都是观察者),有故障和机器状态变化就会通知观察者。

 

使用场景:

(1) 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用。 
        (2) 一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。

  • 大小: 39.4 KB
  • 大小: 23 KB
  • 大小: 75.9 KB
  • 大小: 39.4 KB
  • 大小: 123.9 KB
分享到:
评论

相关推荐

    C#29种设计模式实战演练

    在"C# 29种设计模式实战演练"中,我们涵盖了多个关键的设计模式,让我们逐一深入探讨。 1. **简单工厂模式**:这是一种创建型模式,它提供了一个接口来创建对象,但允许子类决定实例化哪个类。简单工厂模式使得...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    设计模式实战、jdk源码|simple-demo.zip

    本资源主要围绕“设计模式实战”与“JDK源码解读”展开,帮助我们深入理解并运用设计模式,提升代码质量与可维护性。 首先,我们要明白设计模式的分类。设计模式分为三大类:创建型模式(如单例模式、工厂方法模式...

    设计模式实战:使用JAVA开发的飞机大战小游戏,包含了23种设计模式,.zip

    在这个名为"设计模式实战:使用JAVA开发的飞机大战小游戏,包含了23种设计模式,.zip"的项目中,开发者采用Java语言构建了一个飞机大战游戏,同时融入了23种不同的设计模式,这对于学习和理解设计模式在实际开发中的...

    软件工程与软件设计模式实战.pptx

    ### 软件工程与软件设计模式实战 #### 第一章:软件工程概述 ##### 1.1 软件工程定义 软件工程是一门综合性的学科,它结合了计算机科学、管理学等多个领域的知识,旨在高效地进行软件开发工作。软件工程的主要目标...

    MVC设计模式实战ExtJS4.2高级组件+SSH2在线投稿系统

    02.编写几个通用的service方法、设计数据库 03.搭建ExtJS的MVC框架 04.主界面的搭建、登录功能和菜单树的生成 05.创建菜单树、前台保存用户信息 06.菜单树响应事件、我的文章模块界面搭建 07.继续搭建我的文章模块,...

    设计模式实战:使用JAVA实现的飞机大战小游戏,包含了23种设计模式.zip

    《设计模式实战:使用JAVA实现的飞机大战小游戏》是一个基于Java编程语言的项目,它将游戏开发与设计模式的理论知识相结合,为学习者提供了一个实际应用设计模式的平台。这个项目不仅适用于Java后端开发的学习,也...

    基于SpringBoot的Java设计模式实战源码解析

    该项目是利用SpringBoot框架编写的Java设计模式实战源码解析,包含132个文件,其中涵盖118个Java源文件、4个Git忽略文件、4个XML配置文件、3个Markdown文件、3个YAML配置文件。通过实战案例深入理解设计模式与Spring...

    基于Java语言的经典设计模式实战设计源码

    本项目为Java语言编写的经典设计模式实战设计源码集,总计包含275个文件,涵盖239个Java源代码文件、7个PNG图片文件、6个Markdown文档文件、5个JPG图片文件、3个XML配置文件、2个属性文件、1个Git忽略文件及1个JAR包...

    经典设计模式讲解以及项目实战(Java版)

    为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也有几个朋友给我点鼓励,给了star。本文工程...

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴...│ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建型设计模式-Prototype原型设计模式实战《下》.mp4 │ 6.1-接口之间的桥梁-适配器设计模式你知道多少.mp4 │ 6.4

    android源码设计模式解析与实战.pdf下载 完整版高清

    本书从Android源码的角度由浅入深地剖析设计模式的运用,让工程师们把设计与模式重视起来,提升自己的设计能力与代码质量。因此本书适合的读者为初、中、高级Android工程师。另外,设计思想都是相通的,其他领域的...

    基于Go语言的经典设计模式实战源码分享

    该项目是《Go语言设计模式》书籍的配套实战源码,涵盖252个文件,包括245个Go源代码文件、2个PNG图片文件、1个LICENSE文件、1个Markdown描述文件、1个JPG图片文件、1个DS_Store文件、1个环境配置文件。这些代码深入...

    基于Java互联网真实案例的22个设计模式实战设计源码

    涵盖307个文件,其中245个为Java源文件,54个为XML配置文件,并包含少量PNG图片、Git忽略文件、LICENSE、Markdown、YAML、工厂类、SQL等辅助文件,旨在通过实战案例帮助开发者将设计模式理论转化为实际应用技能。

    Android MVP设计模式 实战演练

    在Android应用开发中,MVP(Model-View-Presenter)设计模式是一种常见的架构模式,它有助于提高代码的可测试性和可维护性。本实战演练将深入探讨如何在Android项目中运用MVP模式来构建高效、模块化的应用。 **1. ...

    Android源码设计模式解析与实战.pdf

    《Android 源码设计模式解析与实战》不仅分析了Android源代码的设计模式,更结合实例演示了如何使用这些设计模式。看这本书,既能学到如何分析、学习Android源代码,又能提高自己架构设计水平 《Android 源码设计...

    实战Java高并发程序设计模式视频

    本课程“实战Java高并发程序设计模式”旨在深入探讨如何利用Java技术来设计和实现能够处理大量并发请求的应用。通过观看这个视频教程,你将有机会学习到一系列关键知识点,包括但不限于: 1. **并发基础**:了解...

    设计模式实战代码-单例、简单工厂、策略、观察者、责任链、模板模式

    设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在给定的压缩包文件中,我们关注的是六种不同的设计模式:单例模式、简单工厂模式、策略模式、观察者模式、责任链模式以及模板...

Global site tag (gtag.js) - Google Analytics