主頁 > 軟體設計 > 四,手寫SpringMVC框架,業務層-什么是耦合/依賴?如何解決

四,手寫SpringMVC框架,業務層-什么是耦合/依賴?如何解決

2022-08-18 09:11:11 軟體設計

4. 業務層

4.1 MVC模型

MVCModel(模型),View(視圖),Controller(控制器)

視圖層:用于做資料的展示以及和用戶互動的一個界面=>jsp

控制層:能夠接受客戶端的請求并且進行請求轉發,具體的業務功能還是需要借助模型層組件來完成,CoreServlet  => DispacherServlet + EmpController

模型層:模型分為很多種:

1) 存值的值物件: POJO/VO(value object)/entity/bean  -> Emp

2有資料訪問物件:DAO---資料訪問物件:xxxDao

3) 有業務模型物件:BO,業務物件 比如:xxxService

4) 資料傳輸物件:DTO data transfer object

 

4.1 什么是業務物件

 

 

4.2 區分業務物件和資料訪問物件

4.2.1 單精度方法

DAO中的方法都是單精度方法 或者稱之為細粒度方法,

什么叫單精度?一個方法只考慮一個操作,比如,添加,那就是insert操作,查詢那就是select操作,

 

4.2.2 BO也就是Service層屬于業務方法

BO中的方法屬于業務方法,但實際的業務是比較復雜的,因此業務方法的粒度是比較粗的

比如:注冊這個功能屬于業務功能,也就是說注冊這個方法屬于業務方法,

那么在這個業務方法中包含了多少個DAO方法呢,也就是說注冊這個業務功能需要通過呼叫多個DAO方法的組合呼叫才能完成注冊功能,

 

4.2.3 注冊的功能步驟:

1、檢查用戶名是否已經被注冊—DAO中的select操作,

2、向用戶表新增一條新用戶記錄—DAOinsert操作,

3、向用戶積分表新增一條記錄(新用戶默認初始化積分假如是100分)--DAO中的insert操作

4、向系統訊息表新增一條記錄(某某新用戶注冊了,需要根據通訊錄資訊向他的聯系人推送訊息)--DAO中的insert操作,

5、向系統日志表新增一條記錄(某用戶在某IP在某年某月某日某時某分某秒注冊)--DAO中的insert操作,

 

4.3 代碼的撰寫(mymvc4)

 

 

 

 

4.4 新建IEmpDao & EmpDaoImpl

 

 

 

 

 

 

 

 

 

 

4.5 新建IEmpService & EmpServiceImpl,寫一個reg方法

 

 

 

 

 

 

 

 

 

4.6 EmpController中的代碼

package com.hy.controller;

 

import com.hy.service.IEmpService;

import com.hy.service.impl.EmpServiceImpl;

 

public class EmpController {

private IEmpService empService = new EmpServiceImpl();

 

public void add(String ename,String pwd) {

try {

boolean flag = empService.reg(ename, pwd);

} catch (Exception e) {

e.printStackTrace();

}

}

 

public String index() {

System.out.println("EmpController...index");

return "forward:/WEB-INF/emp/index.jsp";

}

 

public String login(String ename,String pwd) {

System.out.printf("EmpControllerlogin方法獲取的引數值ename=%s,pwd=%s",ename,pwd);

return "redirect:emp.do?ac=index";

}

 

public String delete(Integer eid) {

if(eid !=null ) {

System.out.println("EmpController eid=="+eid);

//empDao.delete(eid);

return "forward:xxx";

}

return "forward:error.xxx";

}

}

5. 什么耦合/依賴

耦合/依賴 :依賴指的是誰離不開誰,這叫依賴,比如:你離不開你女朋友,你依賴你女朋友

在我們系統當中的每個層之間,層與層之間也存在依賴,比如:Controller層必須依賴Service層,例如:現在將ServiceEmpServiceImpl洗掉了,然后EmpController層就會報錯,

同樣,Service層依賴Dao層,

 

 

 

 

 

依賴指的是 某某某 離不開 某某某

在軟體系統中,層與層之間是存在依賴的,我們也稱之為耦合,

我們系統架構或是設計的一個原則就是:高內聚 低耦合,

層內部的組成應該是高度聚合的,而層與層之間的關系應該是低耦合的,

 

而所謂的低耦合,就是我們熟稱的炮友,

 

我想做到的是什么??洗掉EmpServiceImpl  EmpController不報錯,EmpController中有new EmpServiceImpl( ) ; 這么new的會就表示和下層的EmpServiceImpl有關系了,

 

 

 

 

 

 

 

 

6. 如何解決耦合和依賴?

IOC-反轉控制/ DI-依賴注入

6.1 第一步,將=new 刪掉

 

 

 

 

 

 

 

 

6.2 第二步,解決空指標的問題

6.2.1 撰寫applicationContext.xml組態檔,

applicationContext.xml再寫兩行組態檔,在當前的整個組態檔中配置了三個bean,這三個bean就是對應了三個組件,下一步,計劃在系統啟動的時候它就會把這三個組件準備好,放在一個容器里面,誰需要的時候就給誰用

<?xml version="1.0" encoding="UTF-8"?>

 

<beans>

<!--

這個bean標簽的作用是,id中的值,要和將來和ServletPath

中路徑的名做對應,emp對應的就要EmpController這個類來處理,

 -->

<bean id="emp" class="com.hy.controller.EmpController"/>

 

<bean id="empService" class="com.hy.service.impl.EmpServiceImpl"/>

 

<bean id="empDao" class="com.hy.dao.impl.EmpDaoImpl"/>

</beans>

 

6.2.2 新建一個介面 BeanFactory & 實作類ClassPathXMLApplicationContext

 

 

 

 

 

 

 

 

 

6.2.3 ClassPathXMLApplicationContext的代碼

package com.hy.io;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.concurrent.ConcurrentHashMap;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

public class ClassPathXMLApplicationContext implements BeanFactory {

private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

 

// 在默認構造方法中加載組態檔

public ClassPathXMLApplicationContext() {

 

try {

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("applicationContext.xml");

 

// 1,創建DocumentBuilderFactory工廠物件

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

 

// 2,創建DocumentBuilder物件

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

 

// 3,得到Document物件( 注意匯入org.w3c.dom包中的)

Document document = documentBuilder.parse(inputStream);

 

// 4,獲得所有的Bean標簽

NodeList nodeList = document.getElementsByTagName("bean");

 

for (int i = 0, len = nodeList.getLength(); i < len; i++) {

Node node = nodeList.item(i);

 

System.out.println(node.getNodeType() );//1,1,1

 

if( node.getNodeType() == node.ELEMENT_NODE) {

Element element = (Element)node;

String id = element.getAttribute("id");

String className = element.getAttribute("class");

 

boolean flag = map.containsKey(id);

 

if(flag == true)

return;

 

Class clazz = Class.forName(className);

Object o = clazz.newInstance();

 

map.put(id, o);

}

}

 

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

 

@Override

public Object getBean(String id) {

return map.get(id);

}

 

public static void main(String[] args) {

ClassPathXMLApplicationContext applicationContext = new ClassPathXMLApplicationContext();

}

}

 

運行main方法測驗一下,

 

6.2.4 回到DispatcherServlet修改代碼

package com.hy.servlet;

 

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Parameter;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.hy.io.BeanFactory;

import com.hy.io.ClassPathXMLApplicationContext;

import com.hy.utils.StringUtil;

 

@WebServlet("*.do")

public class DispatcherServlet extends HttpServlet {

private BeanFactory beanFactory;

 

public DispatcherServlet() {

}

 

@Override

public void init(ServletConfig config) throws ServletException {

super.init(config);

beanFactory = new ClassPathXMLApplicationContext();

}

 

@Override

protected void service(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 設定編碼

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

 

// 假設url是: http://localhost:8080/mymvc2/hello.do

// ServletPathServlet的訪問路徑: /hello.do

// 思路是:

// 1步: /hello.do -> hello 或者 /book.do -> book

// 2步: hello -> HelloController 或者 book -> BookController

String servletPath = request.getServletPath(); // /hello.do

int lastDotIndex = servletPath.lastIndexOf(".do");

servletPath = servletPath.substring(1, lastDotIndex); // hello

 

// 通過ServletPath獲取對應的Controller物件

// Object xxxController = map.get(servletPath);

Object xxxController = beanFactory.getBean(servletPath);

 

String ac = request.getParameter("ac");

System.out.println("=======ac ===" + ac + "======");

if (StringUtil.isEmpty(ac))

ac = "index";

 

String methodReturnStr = null;

try {

// 這里只能try...catch例外,因為在重寫的方法里,不能拋出比父類更大的例外

Method[] methods = xxxController.getClass().getDeclaredMethods();

 

if (methods != null) {

for (Method method : methods) {

if (ac.equals(method.getName())) {

// 1,統一獲取請求引數

// 1.1 獲取當前方法的引數,回傳引數陣列

Parameter[] parameters = method.getParameters();

// 1.2 有幾個引數就需要準備同等容量的Object型別的陣列,這個陣列用來存放引數的值得

Object[] parameterValues = new Object[parameters.length];

 

for (int i = 0, len = parameters.length; i < len; i++) {

Parameter parameter = parameters[i];

 

// 1.3 從請求中獲取引數的值

String parameterValue = request.getParameter(parameter.getName());

/**

 * 注意,這里沒有考慮 復選框的情況,因為復選框name相同,

 * 打了好幾個勾,一提交,回傳給我們值的是一個陣列 獲取的方法:

 * request.getParameterValues(name);

 */

 

// 1.5 EmpControllerdelete方法的引數需要的是一個Integer型別,

// 通過反射機制我們該方法需要的型別ParameterInteger

// 但是前臺傳遞到后臺的是字串”1”,而不是數字1,所以需要進行型別轉換,

String typeName = parameter.getType().getName();

System.out.println("DispatcherServlet ==== typeName"+typeName);

 

//注意:這里一定要先將String 轉成 Object

Object parameterObj = parameterValue;

 

if(parameterObj != null) {

//注意:這里如果需要完善, 還需要寫Float,Double等型別

if("java.lang.Integer".equals(typeName)) {

parameterObj = Integer.parseInt(parameterValue);

}

}

// 1.4 將獲取的引數值保存在Object型別的陣列當中

//parameterValues[i] = parameterValue;

parameterValues[i] = parameterObj;

}

 

// 2. xxxController中的方法呼叫

// Object returnObj = method.invoke(xxxController, request, response);

Object returnObj = method.invoke(xxxController,parameterValues);

 

// 3, 視圖跳轉處理

if (returnObj != null) {

methodReturnStr = (String) returnObj;

if (methodReturnStr.startsWith("redirect:")) {

String redirectStr = methodReturnStr.substring("redirect:".length());

response.sendRedirect(request.getContextPath() + "/" + redirectStr);

return;

} else if (methodReturnStr.startsWith("forward:")) {

String forwardtStr = methodReturnStr.substring("forward:".length());

request.getRequestDispatcher(forwardtStr).forward(request, response);

return;

}

}

return;

}

}

throw new RuntimeException("ac值違法");

}

} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {

e.printStackTrace();

}

}

}

 

 

6.2.5 回到XxxController中,如何給xxxService賦值??

 

我們將new EmpServiceImpl();洗掉了,去掉了依賴,如何賦值?

而且service層也依賴dao,改成null,去掉了依賴,如何賦值?

 

 

 

 

 

 

6.2.6 如何解決?

applicationContext.xml檔案中先描述我們需要哪些組件,然后再描述組件與組件之間的依賴關系,XxxController中需要XxxServiceXxxService中需要XxxDao

 

 

 

6.2.7 修改ClassPathXMLApplicationContext代碼, 查看獲取了xml中的哪些物件

package com.hy.io;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.concurrent.ConcurrentHashMap;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

public class ClassPathXMLApplicationContext implements BeanFactory {

private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

 

// 在默認構造方法中加載組態檔

public ClassPathXMLApplicationContext() {

 

try {

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("applicationContext.xml");

 

// 1,創建DocumentBuilderFactory工廠物件

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

 

// 2,創建DocumentBuilder物件

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

 

// 3,得到Document物件( 注意匯入org.w3c.dom包中的)

Document document = documentBuilder.parse(inputStream);

 

// 4,獲得所有的Bean標簽

NodeList nodeList = document.getElementsByTagName("bean");

 

for (int i = 0, len = nodeList.getLength(); i < len; i++) {

Node node = nodeList.item(i);

System.out.println(node.getNodeType());// 1,1,1

 

if (node.getNodeType() == node.ELEMENT_NODE) {

Element element = (Element) node;

String id = element.getAttribute("id");

String className = element.getAttribute("class");

 

boolean flag = map.containsKey(id);

 

if (flag == true)

return;

 

Class clazz = Class.forName(className);

// 創建bean物件

Object o = clazz.newInstance();

// bean物件存盤到容器當中

map.put(id, o);

// 到目前為止,我們將所有的bean,已經實體化(new了一個物件),

// 并且存放到了容器當中,但是beanbean物件之間的依賴關系還沒有處理

}

}

System.out.println("=================");

// 5, 組裝bean之間的依賴關系,拿到bean物件之后,如果里面有property標簽則進行組裝

for (int i = 0, len = nodeList.getLength(); i < len; i++) {

Node node = nodeList.item(i);

if (node.getNodeType() == Node.ELEMENT_NODE) {

Element element = (Element) node;

String id = element.getAttribute("id");

//

//element 就是獲取的bean物件,通過getChildNodes()方法

//來獲取這個物件有三個子節點,13是文本節點

 

NodeList childNodes = element.getChildNodes();

// System.out.println(childNodes.getLength());// 3,5,0

//

//if (i == 1) { //查看第二個bean標簽的5個子元素的型別分別是什么,

// for (int j = 0; j < childNodes.getLength(); j++) {

// //NodeType3,8,3,1,3,

// //Node.TEXT_NODE    = 3;

// //Node.COMMENT_NODE = 8;

// //Node.ELEMENT_NODE = 1;

// System.out.print(childNodes.item(j).getNodeType()+",");

// }

//}

}

}

 

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

 

@Override

public Object getBean(String id) {

return map.get(id);

}

 

public static void main(String[] args) {

ClassPathXMLApplicationContext applicationContext = new ClassPathXMLApplicationContext();

}

}

 

 

6.3 正式組裝bean之間的依賴關系

package com.hy.io;

 

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.Field;

import java.util.concurrent.ConcurrentHashMap;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

public class ClassPathXMLApplicationContext implements BeanFactory {

private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();

 

// 在默認構造方法中加載組態檔

public ClassPathXMLApplicationContext() {

 

try {

InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("applicationContext.xml");

 

// 1,創建DocumentBuilderFactory工廠物件

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

 

// 2,創建DocumentBuilder物件

DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

 

// 3,得到Document物件( 注意匯入org.w3c.dom包中的)

Document document = documentBuilder.parse(inputStream);

 

// 4,獲得所有的Bean標簽

NodeList nodeList = document.getElementsByTagName("bean");

 

for (int i = 0, len = nodeList.getLength(); i < len; i++) {

Node node = nodeList.item(i);

 

System.out.println(node.getNodeType());// 1,1,1

 

if (node.getNodeType() == node.ELEMENT_NODE) {

Element element = (Element) node;

String id = element.getAttribute("id");

String className = element.getAttribute("class");

 

boolean flag = map.containsKey(id);

 

if (flag == true)

return;

 

Class clazz = Class.forName(className);

// 創建bean物件

Object o = clazz.newInstance();

// bean物件存盤到容器當中

map.put(id, o);

// 到目前為止,我們將所有的bean,已經實體化(new了一個物件),

// 并且存放到了容器當中,但是beanbean物件之間的依賴關系還沒有處理

}

}

System.out.println("=================");

// 5, 組裝bean之間的依賴關系,拿到bean物件之后,如果里面有property標簽則進行組裝

for (int i = 0, len = nodeList.getLength(); i < len; i++) {

Node node = nodeList.item(i);

if (node.getNodeType() == Node.ELEMENT_NODE) {

Element element = (Element) node;

String id = element.getAttribute("id");

//

// element 就是獲取的bean物件,通過getChildNodes()方法

// 來獲取這個物件有三個子節點,13是文本節點

 

NodeList childNodes = element.getChildNodes();

// System.out.println(childNodes.getLength());// 3,5,0

//

// if (i == 1) { //查看第二個bean標簽的5個子元素的型別分別是什么,

// for (int j = 0; j < childNodes.getLength(); j++) {

// //NodeType3,8,3,1,3,

// //Node.TEXT_NODE = 3;

// //Node.COMMENT_NODE = 8;

// //Node.ELEMENT_NODE = 1;

// System.out.print(childNodes.item(j).getNodeType()+",");

// }

// }

 

for (int j = 0; j < childNodes.getLength(); j++) {

Node childNode = childNodes.item(j);

 

if (childNode.getNodeType() == Node.ELEMENT_NODE

&& "property".equals(childNode.getNodeName())) {

Element propertyElement = (Element)childNode;

 

//獲取其name屬性和ref屬性

String propertyName = propertyElement.getAttribute("name");

String propertyRef = propertyElement.getAttribute("ref");

 

//找到ref對應的實體物件

Object refObj = map.get(propertyRef);

 

//refObj設定到當前bean對應的物件的property屬性上來

Object beanObj = map.get(id);

 

//獲取該物件的類物件

Class beanClazz = beanObj.getClass();

 

//獲得該類物件的屬性

Field propertyField = beanClazz.getDeclaredField(propertyName);

 

//設定其可訪問性

propertyField.setAccessible(true);

 

propertyField.set(beanObj, refObj);

}

}

}

}

 

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

}

}

 

@Override

public Object getBean(String id) {

return map.get(id);

}

 

public static void main(String[] args) {

ClassPathXMLApplicationContext applicationContext = new ClassPathXMLApplicationContext();

}

}

http://127.0.0.1:8080/mymvc4/emp.do?ac=add&ename=aaa&pwd=bbb

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/502157.html

標籤:架構設計

上一篇:9大性能優化經驗總結,強烈建議收藏!

下一篇:五,手寫SpringMVC框架,過濾器的使用

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more