Git Product home page Git Product logo

fuzhengwei / itstack-demo-design Goto Github PK

View Code? Open in Web Editor NEW
6.2K 114.0 1.9K 1.77 MB

:art: 《重学Java设计模式》是一本互联网真实案例实践书籍。以落地解决方案为核心,从实际业务中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,来学习设计模式的运用。欢迎关注小傅哥,微信(fustack),公众号:bugstack虫洞栈,博客:https://bugstack.cn

Home Page: https://bugstack.cn

License: Apache License 2.0

Java 100.00%
java springboot

itstack-demo-design's Introduction

重学 Java 设计模式

作者: 小傅哥,Java Developer,✏️ 虫洞 · 科技栈,作者🏆 CSDN 博客专家

本代码库是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!





⛳ 目录

书籍下载&购买

- 小傅哥的《重学 Java 设计模式》 ⭐⭐⭐⭐

本书是作者小傅哥,投入50天时间,从互联网实际业务开发中抽离出,交易、营销、秒杀、中间件、源码等22个真实业务场景,编写了18万字271页的实战型Java编程资料。如果书中含有不易理解的内容,一定是作者在编写的过程中缺少必要的描述和严格的校准,感谢把你的意见或者疑问提交给我,也欢迎与我多一些交互,互相进步共同成长。

源码下载

欢迎更多小伙伴,贡献关于此设计模式其他版语言,我会帮你添加链接

内容简介

Hello, world of design! 你好,设计模式的世界!

欢迎来到这里,很高兴你能拿到这本书,如果你能坚持看完并按照书中的例子进行实践,那么在编程开发的世界里,就又多了一个可以写出良好代码的人,同时也为架构师培养储备了一个人才。

可能在此之前你也多少了解过设计模式,但在实际的业务开发中使用却不多,多数时候都是大面积堆积ifelse组装业务流程,对于一次次的需求迭代和逻辑补充,只能东拼西凑Ctrl+CCtrl+V

所以为了能让更多的程序员👨‍💻‍更好的接受设计**和架构思维,并能运用到实际的业务场景。本书的作者小傅哥,投入50天时间,从互联网实际业务开发中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,来学习设计模式实践使用的应用可上手技能。

谁发明了设计模式?

设计模式的概念最早是由 克里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了城市设计的 “语言”,提供了253个描述城镇、邻里、住宅、花园、房间及西部构造的模式, 而此类 “语言” 的基本单元就是模式。后来,埃里希·伽玛约翰·弗利赛德斯拉尔夫·约翰逊理查德·赫尔姆 这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。

其实有一部分人并没有仔细阅读过设计模式的相关书籍和资料,但依旧可以编写出优秀的代码。这主要是由于在经过众多项目的锤炼和对程序设计的不断追求,从而在多年编程历程上提炼出来的心得体会。而这份经验最终会与设计模式提到的内容几乎一致,同样会要求高内聚、低耦合、可扩展、可复用。你可能也遇到类似的经历,在学习一些框架的源码时,发现它里的某些设计和你在做开发时一样。

我怎么学不会设计模式?

钱也花了,书也买了。代码还是一坨一坨的!设计模式是由多年的经验提炼出来开发指导**。就像我告诉你自行车怎么骑、汽车怎么开,但只要你没跑过几千公里,你能记住的只是理论,想上道依旧很慌!

所以,本设计模式专题系列开始,会带着你使用设计模式的**去优化代码。从而学习设计模式的心得并融入给自己。当然这里还需要多加练习,一定是人车合一,才能站在设计模式的基础上构建出更加合理的代码。

阅读建议

本书属于实战型而不是理论介绍类书籍,每一章节都有对应的完整代码,学习的过程需要参考书中的章节与代码一起学习,同时在学习的过程中需要了解并运行代码。学习完成后进行知识点的总结,以及思考🤔这样的设计模式在自己的业务场景中需要如何使用。

电子版(旧版) - 👉在线阅读


参与贡献

  1. 如果您对本项目有任何建议或发现文中内容有误的,欢迎提交 issues 进行指正。
  2. 对于文中我没有涉及到知识点,欢迎提交 PR。

与我联系

  • 加群交流 本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “小傅哥” 微信(fustack),备注:加群。

  • 公众号(bugstack虫洞栈) - 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。

致谢

感谢以下人员对本仓库做出的贡献或者对小傅哥的赞赏,当然不仅仅只有这些贡献者,这里就不一一列举了。如果你希望被添加到这个名单中,并且提交过 Issue 或者 PR,请与我联系。

🌱 感谢大家对仓库建设的贡献

截止到此设计模式内容就全部讲完了,可能书中会因作者水平有限,有一些描述不准确或者错字内容。欢迎提交给我,也欢迎和我讨论相关的技术内容,作者小傅哥,非常愿意与同好进行交流,互相提升技术。

itstack-demo-design's People

Contributors

fuzhengwei avatar jacianliu avatar linwancen avatar weipeng001 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

itstack-demo-design's Issues

门面模式-itstack-demo-design-10-02-字符串分割的问题

itstack-demo-design-10-02
org.itstack.demo.design.door.config.StarterService#split(String separatorChar )
第20行,使用spring中的工具类,只能将一个字符串分割成两段.
return StringUtils.split(this.userStr, separatorChar);
如配置文件中 userStr: 1001,aaaa,ccc
使用这个方法会将字符串分割成 1001 和 aaaa,ccc两部分,并不会分割成1001、aaaa和ccc三部分
达不到配置多个白名单的效果

itstack-demo-design-4-01 缺少依赖

问题描述:

itstack-demo-design-4-01org.itstack.demo.design.QuestionBankController 出现报红。检查后发现缺少引入 itstack-demo-design-4-00 的依赖。

依赖:

    <dependencies>
        <dependency>
            <artifactId>itstack-demo-design-4-00</artifactId>
            <groupId>org.itstack</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

截图

image

你好,想问个代码中的问题

作者你好,在看书中有个代码的实现细节不是很懂。
1.
在设计模式部分的itstack-demo-design项目中的itstack-demo-design/itstack-demo-design-2-02/src/main/java/org/itstack/demo/desgin/factory/JDKProxy.java 这个类里的方法
getProxy(Class《T》 interfaceClass, ICacheAdapter cacheAdapter)
中第一个参数是带泛型T,然后最后返回的值进行类型转换
return (T) Proxy.newProxyInstance(classLoader, new Class[]{classes[0]}, handler);
我想问的是在测试的时候
CacheService proxy_EGM = JDKProxy.getProxy(CacheServiceImpl.class, new EGMCacheAdapter());
这句话为什么第一个参数传入的是实现类的类对象,而不是接口的类型?
因为我看的一些动态代理介绍说的是对于产生的代理对象,不能强转为实现类,只能转为接口类型。
可能我对泛型理解的有问题 : (
2.第二个问题是对于设计模式这本书中,在其他资料上介绍说抽象工厂是工厂的工厂,我想问一下本书中的通过代理实现的抽象工厂,返回的这个代理对象是不是就是其他资料上指的,由抽象工厂产生的工厂?因为刚学设计模式,书里也没有明确点出,看的不是很懂。

你好,想问一下关于 Singleton_06 的问题

    public static final Singleton_06 getInstance() {
        for (; ; ) {
            Singleton_06 instance = INSTANCE.get();
            if (null != instance) return instance;
            INSTANCE.compareAndSet(null, new Singleton_06());
            return INSTANCE.get();
        }
    }

你好,想问一下这里的 for (; ; ) 有什么用哇,应该第一次循环就会 return INSTANCE.get(); 的?

itstack-demo-design-10-00 补充个单测

 package org.itstack.demo.design.test;


import org.itstack.demo.design.web.HelloWorldController;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApiTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void helloTest() throws Exception {

        MvcResult mvcResult = null;

        mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/api/queryUserInfo?userId=1001")
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        Assert.assertEquals("{\"code\":\"0000\",\"info\":\"success\",\"name\":\"虫虫:1001\",\"age\":19,\"address\":\"天津市南开区旮旯胡同100号\"}", mvcResult.getResponse().getContentAsString());

        mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/api/queryUserInfo?userId=99999999")
                        .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
        Assert.assertEquals("{\"code\":\"1111\",\"info\":\"非白名单可访问用户拦截!\",\"name\":null,\"age\":null,\"address\":null}", mvcResult.getResponse().getContentAsString());


    }


}

面向对象的设计模式如何与关系型数据库结合

大佬,请问下,面向对象的设计模式如何与关系型数据库结合?
因为系统数据都是要存储的,99%都是要落关系型数据库,设计模式学完后还是没想到怎么和关系型数据库结合,设计系统的时候还是按照关系型数据表的存储来设计的。
请问下用设计模式,能提高此类系统的开发效率、开发质量、扩展性、可读性、复用性么?

代码编译报错

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project itstack-demo-desgin-4-01: Compilation failure: Compilation failure:
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[12,14] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[12,65] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[13,14] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[13,65] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[46,36] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[47,36] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[48,36] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[49,36] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[50,36] 找不到符号
[ERROR] 符号: 类 ChoiceQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[51,36] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[52,36] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[53,36] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] /Users/haibinlu/github/design-pattern/itstack-demo-design/itstack-demo-desgin-4-01/src/main/java/org/itstack/demo/design/QuestionBankController.java:[54,36] 找不到符号
[ERROR] 符号: 类 AnswerQuestion
[ERROR] 位置: 类 org.itstack.demo.design.QuestionBankController
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :itstack-demo-desgin-4-01

编译打包项目,一大堆报错

第一个报错是某个工程使用了其他工程的类,但是没引入依赖,
第二个报错是,maven使用了Java1.6版本的插件编译项目,导致语法不支持报错
第三个报错则是下面这个,还有一些其他报错就不列举了
[ERROR] Failed to execute goal on project itstack-demo-design-10-01: Could not resolve dependencies for project org.itstack:itstack-demo-design-10-01:jar:1.0-SNAPSHOT: Could not find artifact org.springframework.boot:itstack-demo-design-10-00:jar:2.1.2.RELEASE in alimaven (http://maven.aliyun.com/nexus/content/groups/public/) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn -rf :itstack-demo-design-10-01

itstack-demo-design-16-02的pom.xml里需要修改maven插件的编译版本

itstack-demo-design-16-02的pom.xml里需要修改maven插件的编译版本

pom里指定jdk版本就好了

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

项目编译出现错误

itstack-demo-design-10-01 mvn package 执行报错

Could not find artifact org.springframework.boot:itstack-demo-design-10-00:pom:2.1.2.RELEASE in alimaven (https://maven.aliyun.com/repository/public/)

我看之前的issue也提到了这个问题。。。但是根据傅哥给出的解决办法,我没有整体打包,单独打包itstack-demo-design-10-01也不行,还是会报错,有大佬可以提供一下解决思路吗,目前已经尝试过更改 groupId 及 version,也试过单独打包,但是都没能成功解决

项目编译出现错误

itstack-demo-design-10-01 mvn package 执行报错

Could not find artifact org.springframework.boot:itstack-demo-design-10-00:pom:2.1.2.RELEASE in alimaven (https://maven.aliyun.com/repository/public/)

我看之前的issue也提到了这个问题。。。但是根据傅哥给出的解决办法,我没有整体打包,单独打包itstack-demo-design-10-01也不行,还是会报错,有大佬可以提供一下解决思路吗,目前已经尝试过更改 groupId 及 version,也试过单独打包,但是都没能成功解决

在编译过程中遇到的一些问题

环境 JDK1.8.0251+MAVEN3.6.1+IDEA
##[1]itstack-demo-design-8-02 报错信息为 错误: -source 1.6 中不支持 diamond 运算符
修改子项目下的pom.xml

  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>8</source>
                  <target>8</target>
              </configuration>
          </plugin>
      </plugins>
  </build> 

##[2]itstack-demo-design-10-01 报错信息为 Cannot resolve org.itstack.demo.design.domain.UserInfo

我发现他打包的时候将itstack-demo-design-10-00项目的包打到了org.springframework.boot
修改itstack-demo-design-10-00子项目下的pom.xml

    <!--修改前-->
    <packaging>war</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!--修改后-->
   <parent>
        <artifactId>itstack-demo-design</artifactId>
        <groupId>org.itstack</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <packaging>jar</packaging>

另<dependencies></dependencies><groupId></groupId>的值为org.springframework.boot的都加上<version>2.1.2.RELEASE</version>
##[3]报错信息为 错误: -source 1.5 中不支持 diamond 运算符
Maven Compiler 插件默认会加 -source 1.5 及 -target 1.5 参数来编译(估计是为了兼容一些比较老的 Linux 服务器操作系统,它们通常只有 JDK 5),而我们的代码里使用了 JDK 7/8 的语法。

    <build>
        ...
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
        ...
    </build>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.